【问题标题】:SQLite-net-pcl not working properly on Android 7.0 (Xamarin)SQLite-net-pcl 在 Android 7.0 (Xamarin) 上无法正常工作
【发布时间】:2017-01-21 22:10:45
【问题描述】:

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

到目前为止,在全新安装的 Android 7.0 上,应用程序将由于 SQLException 以及无法创建 PK 的问题而崩溃。如果我卸载应用程序存储,即从应用程序设置中擦除应用程序,然后该应用程序就可以正常运行了。

所有其他平台似乎都可以立即安装。自己看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);
}

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

【问题讨论】:

  • 尝试将objectId 主键更改为int,然后添加SQLite.AutoIncrement 注释。
  • 嘿@hvaughan3。我已经设法解决了我的问题。完全不知道如何,但现在似乎正在工作。我设法从这个问题转到另一个刚刚解决的问题。
  • 不错!签入您的代码,然后永远不要再触摸它,这样它就不会再次中断;)
  • 哈哈@hvaughan3。我正在为此做很多备份,现在它正在工作。非常感谢您的帮助!

标签: xamarin sqlite-net


【解决方案1】:

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

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

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

【讨论】:

  • 嗨,是的,我实际上也搬到了这个图书馆。这就是导致问题的原因。我正在运行 SQLite.Net 并且它可以工作,但在 Android N 上,一个弹出窗口不断出现,说有关 sqlite.so。然后我换到 SQLite-net-plc,现在这已经杀死了我的 Android 和 iOS 项目。似乎很奇怪,其他人都有他们的工作。我很困惑,因为我错过了一些东西。我花了大约 1 天的时间试图解决这个问题,但现在真的卡住了。
  • @PhillWiggins 然后我们需要查看实际代码以了解有关问题的任何信息。
  • 谢谢@hvaughan3 我已经添加了用于创建表的对象类和数据库类。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多