2017-02-27 3 views
1

Ich habe eine Klasse Produkt, um einige Informationen über ein Produkt zu speichern und in einer SQLite DB in meiner Xamarin Anwendung zu speichern.Nicht in SQLite DB in Xamarin App löschen

class Product 
{ 
    [PrimaryKey, AutoIncrement, Column("ID")] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Category { get; set; } 


    public Product(string name, string category) 
    { 
     Name = name; 
     Category = category; 
    } 

    public Product() 
    { 

    } 
} 

In meinem Code erstelle ich ein Produkt Objekt als

Product s = new Product(); 
     s.Name = some_name; 
     s.Category = some_category; 

und stecke in meiner DB durch:

var db = new SQLiteConnection(db_path); 
var table = db.Table<Product>(); 
db.Insert(s); 

Das Problem ist, dass der Primärschlüssel ist immer 0 offenbar und wenn Ich versuche, einen Datensatz in meiner Tabelle zu löschen, indem ich ein Element übergebe. Ich habe einen Nullpunkt

private void deleteThisProduct(Product item) 
{ 
    var db = new SQLiteConnection(db_path); 
    var table = db.Table<Product>(); 
    var toDelete = table.Where(x => x.ID == item.ID).FirstOrDefault(); 
    if (toDelete != null) 
     { 
      db.Delete(toDelete); 
      Toast.MakeText(this, "Delete Successfully", ToastLength.Short).Show(); 
     } 
     else 
     { 
      Toast.MakeText(this, "Not Found", ToastLength.Short).Show(); 
     } 
} 

Welches Element ich auch an die Löschfunktion übergebe, toDelete ist immer null und ich kann den Datensatz nicht aus der Datenbank löschen. Seltsam, wenn alle meine Datensätze (der Klasse Product) einen Primärschlüssel von 0 haben, sollte meine Linq-Abfrage etwas finden, aber es gibt immer eine Null zurück.

Was mache ich falsch? Ist meine Produktklasse das Problem? Vielen Dank.

Nur klar sein, auch wenn auf dem obigen Code ich einfach tun:

db.Delete(item) 

ich nicht den dazugehörigen Datensatz aus der Tabelle entfernen kann.

+0

Die Produkt-ID darf in der Tabelle nicht 0 sein, da dieses Feld als PrimaryKey markiert ist.Erstellen Sie eine Methode, um alle Elemente zu erhalten, und überprüfen Sie, welche ID sie haben.Methode 'deleteThisProduct()' können Sie nur übergeben in der productId 'private void deleteThisProduct (int productId)' als das ist alles, was Sie verwenden. – apineda

+0

Deshalb finde ich das alles komisch. Die ID ist nicht richtig eingestellt und dies verursacht Probleme beim Aufruf von db.Delete() –

Antwort

0

Haben Sie versucht, Ihre Produktklasse in einem Product.cs zu sparen: `

[Serializable()] 
    public class Product 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Category { get; set; }` 
} 

und in der Tabelle erstellen:

„TABLE Produkt erstellen (ID INTEGER PRIMARY KEY, ....

+0

Produkt ist bereits in einem Product.cs. Das einzige, was ich nicht getan habe, ist das Hinzufügen von [Serializable()] am Anfang –

+0

Haben Sie das db-Feld als Primärschlüssel in der Tabellendefinition deklariert? – user1230268

+0

Ja. Dies geschieht automatisch, wenn ich meine Product-Klasse an db.CreateTable übergeben () –