运算符'!='不能应用于'Task'和'int'类型的操作数。

8

最近我开始使用Xamarin创建Android应用程序。我尝试使用SQLite创建一个小的本地数据库。我使用了来自Xamarin文档网站的以下教程。

不幸的是,我遇到了错误:

错误CS0019:运算符'!='不能应用于类型为'Task'和'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个回答

8
你可以这样做:
if ( (await db.InsertAsync(data)) != 0)

另外查看这个答案,了解为什么通常更喜欢使用await而不是使用.Result


4

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

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

为了

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

谢谢,这就是错误。我也需要使用await,对吗? - The user without number
不行,因为我认为await发生在InsertAsync中。为了做到这一点,您需要在自己的异步方法中调用它并等待响应,然后返回int以进行比较。 - Mr. B
1
这非常危险,可能会导致死锁。使用await - Patrick Hofman

4

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

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

这需要您的方法也是异步的,因此签名应该如下所示:
private async Task<string> insertUpdateData(...)

@没有编号的用户 - 这应该被标记为下一个有相同问题的开发者最佳答案。 - Mr. B
让楼主选择最佳答案即可,@Mr.B - Patrick Hofman

2

如果您想让innsertUpdateData成为异步操作,可以使用async、await。

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

1
你需要在 db.InsertAsync(data) 上添加 .result。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接