接线员'!='不能应用于类型'任务'的操作数。和' int'

时间:2016-03-16 10:56:05

标签: c# android sqlite xamarin xamarin.android

最近我开始使用Xamarin创建Android应用程序。我尝试用SQLite创建一个小型本地数据库。我使用了Xamarin documentation website中的以下教程。

不幸的是我收到了错误:

  

错误CS0019:操作员'!='不能应用于类型'任务'的操作数。和' int' (CS0019)

我的代码如下:

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;
        }
    }

Person类如下:

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);
    }
}
}

有人可以帮我解决这个错误吗?

5 个答案:

答案 0 :(得分:7)

你可以这样做:

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

另请参阅this answer了解await通常优先使用.Result的原因。

答案 1 :(得分:4)

您应该等待结果,而不是使用可能导致死锁的Result

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

这要求您的方法也是异步的,因此签名应为:

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

答案 2 :(得分:2)

这告诉您需要比较结果而不是任务。请更新此行:

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

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

答案 3 :(得分:2)

你可以使用async,等待你想要innsertUpdateData是异步的。

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;
        }
}

答案 4 :(得分:1)

您需要在db.InsertAsync(data)

上添加.result