Xamarin Forms从sqlite数据库中删除

时间:2016-10-19 07:29:45

标签: c# linq sqlite xamarin.forms

我有一个类公告,我有一个id列表,我正在使用nuget包:sqlite-net-pcl。 如果我有公告,我如何从公告表中删除公告。我尝试使用linq,如:await connection.DeleteAsync(announcement).Where(...) 但我不能使用DeleteAsync的Where,所以我试过

var query = connection.Table<Announcement>().Where(announcement=>announcement.AnnouncementId == announcementId)

它给了我这个错误:System.NotSupportedException:无法删除AsyncTableQuery`1:它没有PK

3 个答案:

答案 0 :(得分:1)

我从来没有使用过有问题的nuget,但我已快速查看了源代码,看来TableQuery有一个名为Delete的同步方法,它返回一个整数。

上面包含的代码是返回TableQuery<Announcement>类型的对象。 TableQuery类包含以下定义:

public int Delete(Expression<Func<T, bool>> predExpr)
{
    if (predExpr.NodeType == ExpressionType.Lambda) {
        var lambda = (LambdaExpression)predExpr;
        var pred = lambda.Body;
        var args = new List<object> ();
        var w = CompileExpr (pred, args);
        var cmdText = "delete from \"" + Table.TableName + "\"";
        cmdText += " where " + w.CommandText;
        var command = Connection.CreateCommand (cmdText, args.ToArray ());

        int result = command.ExecuteNonQuery();
        return result;
    } else {
        throw new NotSupportedException ("Must be a predicate");
    }
}

您似乎应该使用以下内容:

connection.Table<Announcement>().Delete(announcement=>announcement.AnnouncementId == announcementId)    

此代码完全未经测试,并且是在Github(https://github.com/praeclarum/sqlite-net/blob/master/src/SQLite.cs)上查看nuget包的源代码。

答案 1 :(得分:1)

我认为你正在寻找这样的东西:

public static int Delete(string url)
{
    using (var databaseManager = DatabaseManager.Instance)
    {
        lock (databaseManager)
        {
            return databaseManager.Database.Table<File>().Delete(x => x.Url == url);
        }
    }
}

这是using SQLite;
https://developer.xamarin.com/guides/android/data-and-cloud-services/data-access/part-3-using-sqlite-orm/

答案 2 :(得分:0)

让您的ID属性成为主键属性?

[PrimaryKey,AutoIncrement]
public int Id { get; set; }