SQLite-net-pcl在Android 7.0上无法正常工作(Xamarin)

时间:2017-01-21 22:10:46

标签: xamarin sqlite-net

SQLite-net-pcl似乎适用于除Android 7.0之外的所有平台。

到目前为止,在新安装的Android 7.0上,由于SQLException存在无法创建PK的问题,应用程序将崩溃。如果我卸载应用程序存储I.e.从应用程序设置中擦除应用程序,该应用程序然后完美运行。

所有其他平台似乎立即安装。亲自看看https://play.google.com/store/apps/details?id=com.purewowstudio.fivestartips

我似乎无法解决这个问题。最糟糕的是,我共享DB PCL的iOS根本没有加载。

有谁知道如何解决这个问题?

代码示例: -

对象

using System;

namespace App.LocalObjects
{
[Preserve(AllMembers = true)]
public class LocalArticle
{

    [SQLite.PrimaryKey, SQLite.Column("articleObjectId")]
    public string objectId { get; set; }
    public DateTime createdAt { get; set; }
    public DateTime updatedAt { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Url { get; set; }
    public int Status { get; set; }

    public LocalArticle()
    {
        this.objectId = " ";
        this.Title = " ";
        this.Description = " ";
        this.Url = " ";
    }
}
}

数据库

using System;
using System.Linq;
using System.Collections.Generic;
using SQLite;
using App.LocalObjects;

namespace App.DataLayer
{

public class Database
{
    static object locker = new object();
    public SQLiteConnection database;
    public string path;

    public Database(SQLiteConnection conn)
    {
        database = conn;
        database.CreateTable<LocalArticle>();
    }

public int SaveLocalArticleItem(LocalArticle item)
    {
        lock (locker)
        {

            LocalArticle article = database.Table<LocalArticle>().FirstOrDefault(x => x.objectId == item.objectId);

            if (article != null && article.objectId.Equals(item.objectId) && !article.updatedAt.Equals(item.updatedAt))
            {
                database.Update(item);

                return item.ID;
            } else {
                return database.Insert(item);
            }
        }
    }

初始化数据库的代码:

using System;
using System.IO;
using Android.App;
using App.BusinessLayer.Managers;
using App.BusinessLayer.ParseObjects;
using App.Utils;
using Android.Content;
using Com.Nostra13.Universalimageloader.Core;
using Com.Nostra13.Universalimageloader.Core.Assist;
using Android.Graphics;
using Com.Nostra13.Universalimageloader.Cache.Memory.Impl;
using Com.OneSignal;
using Parse;
using SQLite;

namespace App.Droid
{
[Application(LargeHeap = true)]
public class App : Application
{

    public static App Current { get; private set; }
    public ModelManager modelManager { get; set; }
    private SQLiteConnection conn;
    private ImageLoader imageLoader;

public App(IntPtr handle, global::Android.Runtime.JniHandleOwnership transfer)
        : base(handle, transfer)
    {
        Current = this;
    }

public override void OnCreate()
    {
        base.OnCreate();

        SetupParse();
        SetupDB();
}

private void SetupParse()
    {
        ParseObject.RegisterSubclass<ParseArticle>();

        ParseClient.Initialize(new ParseClient.Configuration
        {
            ApplicationId = Constants.ParseApplicationID,
            Server = Constants.ParseServer
        });


    }

    private void SetupDB()
    {

        var sqliteFilename = Constants.DBName;
        string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        var path = System.IO.Path.Combine(libraryPath, sqliteFilename);
        conn = new SQLiteConnection(path);

        modelManager = new ModelManager(conn);
}

以下是我的项目当前引用的内容: -

enter image description here

2 个答案:

答案 0 :(得分:1)

Android N开始实际执行有关访问Android附带的SQLite库的规则。因此,以前直接访问SQLite而不经过特殊Java包装器的任何应用程序(或应用程序库)已经在技术上打破了规则,这不是问题的原因是因为Android从未真正强制执行这些规则。详细了解here

现在Android N确实执行了这些规则,它会导致崩溃。我猜您正在使用SQLite.Net-PCL库来访问您的SQLite DB。如果您查看here,那么图书馆创建者永远不会修复的确切问题存在未解决的问题。

我们遇到了同样的问题,并且已经切换到SQLite-Net-PCL库(注意破折号而不是句点),其工作方式完全相同,并且具有几乎相同的API。可以找到该库的链接here

答案 1 :(得分:0)

我有同样的问题。 i install this package for sqlite并将目标版本设置为android 8(oreo),我的应用程序将再次运行