2016-03-16 19 views
7

Kürzlich begann ich Android-Anwendungen mit Xamarin zu erstellen. Ich versuche eine kleine lokale Datenbank mit SQLite zu erstellen. Ich habe das folgende Tutorial von Xamarin documentation website verwendet.Operator '! =' Kann nicht auf Operanden vom Typ 'Task' und 'int' angewendet werden

Leider bekomme ich einen Fehler:

Error CS0019: Operator '!=' cannot be applied to operands of type 'Task' and 'int' (CS0019)

Mein Code ist folgende:

private string createDatabase(string path) 
    { 
     try 
     { 
      var connection = new SQLiteAsyncConnection(path);{ 
       connection.CreateTableAsync<Person>(); 
       return "Database created"; 
      } 
     } 
     catch (SQLiteException ex) 
     { 
      return ex.Message; 
     } 
    } 

    private string insertUpdateData(Person data, string path) 
    { 
     try 
     { 
      var db = new SQLiteAsyncConnection(path); 
      if (db.InsertAsync(data) != 0) 
       db.UpdateAsync(data); 
      return "Single data file inserted or updated"; 
     } 
     catch (SQLiteException ex) 
     { 
      return ex.Message; 
     } 
    } 

    private int findNumberRecords(string path) 
    { 
     try 
     { 
      var db = new SQLiteConnection(path); 
      // this counts all records in the database, it can be slow depending on the size of the database 
      var count = db.ExecuteScalar<int>("SELECT Count(*) FROM Person"); 

      // for a non-parameterless query 
      // var count = db.ExecuteScalar<int>("SELECT Count(*) FROM Person WHERE FirstName="Amy"); 

      return count; 
     } 
     catch (SQLiteException ex) 
     { 
      return -1; 
     } 
    } 

und die Person-Klasse ist die folgende:

using System; 
using SQLite; 

namespace HelloWorld { 
public class Person 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 

    public string FullName { get; set; } 

    public string CarLicense { get; set; } 

    public override string ToString() 
    { 
     return string.Format("[Person: ID={0}, FullName={1}, CarLicense={2}]", ID, FullName, CarLicense); 
    } 
} 
} 

jemand mir helfen kann mit dem dieser Fehler?

Antwort

7

Sie können es wie folgt tun:

if ((await db.InsertAsync(data)) != 0) 

Auch this answer aus Gründen, warum await oft über mit .Result bevorzugt.

2

Dies sagt Ihnen, dass Sie das Ergebnis anstelle der Aufgabe vergleichen müssen. Bitte aktualisieren Sie diese Zeile:

if (db.InsertAsync(data) != 0) 

zu

if (db.InsertAsync(data).Result != 0) 
+0

danke, das war der Fehler. Und ich muss auch abwarten, oder? –

+0

Nein, weil die Erwartung in der InsertAsync passiert glaube ich. Um dies zu tun, müssten Sie es in Ihrer eigenen asynchronen Methode aufrufen und auf die Antwort warten und dann das int zum Vergleich zurückgeben. –

+1

Dies ist sehr gefährlich und kann zu Deadlocks führen. Verwende 'erwarten'! –

1

Sie müssen hinzufügen .RESULT auf db.InsertAsync (Daten)

4

Statt Result der Verwendung, die toten Schlösser verursachen kann, Sie sollte das Ergebnis erwarten:

if (await db.InsertAsync(data) != 0) 
{ 
    await db.UpdateAsync(data); 
} 

Das erfordert, dass Ihre Methode auch async ist, also die Signatur e sollte lauten:

private async Task<string> insertUpdateData(...) 
+0

@Der Benutzer ohne Nummer - Dies sollte als die beste Antwort für den nächsten Entwickler mit der gleichen Frage markiert werden. –

+0

Lassen Sie OP einfach die beste Antwort auswählen @ Mr.B –

2

Sie async verwenden können, erwarten, wenn Sie möchten, dass innsertUpdateData asynchron sein wird.

private async Task<string> insertUpdateData(Person data, string path) 
{ 
     try 
     { 
      var db = new SQLiteAsyncConnection(path); 
      if (0 != await db.InsertAsync(data)) 
       await db.UpdateAsync(data); 
      return "Single data file inserted or updated"; 
     } 
     catch (SQLiteException ex) 
     { 
      return ex.Message; 
     } 
} 
Verwandte Themen