2017-01-21 14 views
0

SQLite-net-pcl кажется работать на всех платформах, кроме Android 7.0.SQLite-net-pcl не работает должным образом на Android 7.0 (Xamarin)

До сих пор на Android 7.0 из новой установки приложение вылетает из-за SQLException с проблемой, что он не может создать ПК. Если я удалю хранение приложений I.e. вытрите приложение из настроек приложения, приложение работает отлично.

Все остальные платформы, кажется, устанавливаются мгновенно. Смотрите для себя https://play.google.com/store/apps/details?id=com.purewowstudio.fivestartips

Я не могу это исправить. Хуже всего, мой iOS, который разделяет DB PCL, не загружается вообще.

Кто-нибудь знает, как это исправить?

Пример кода: -

Объект

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

Database

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

+0

Попробуйте изменить первичный ключ 'objectId' на' int', а затем добавить к нему аннотацию 'SQLite.AutoIncrement'. – hvaughan3

+0

Эй @ hvaughan3. Мне удалось исправить мою проблему. Не уверен, как вообще, но, похоже, сейчас работает. Мне удалось перейти от этой проблемы к другой, которая только что была решена. –

+0

Ницца! Проверьте свой код, а затем не трогайте его снова, чтобы он снова не сломался;) – hvaughan3

ответ

0

Android N начал фактически соблюдение правил вокруг доступа к SQLite библиотеки, которые приходят с Android. Поэтому любое приложение (или библиотека приложений), которое ранее напрямую обращалось к SQLite без прохождения специальной оболочки Java, уже теоретически нарушало правила, причина в том, что это не проблема, потому что Android никогда не применял эти правила. Узнайте больше об этом here

Теперь, когда Android N применяет эти правила, это приводит к возникновению сбоя. Я предполагаю, что вы используете библиотеку SQLite.Net-PCL для доступа к вашей базе данных SQLite. Если вы посмотрите here, существует открытая проблема для этой точной проблемы, которую создатели библиотеки никогда не исправляли.

Мы столкнулись с той же проблемой и с тех пор перешли на библиотеку SQLite-Net-PCL (обратите внимание на тире вместо периода), которая работает точно так же и имеет почти идентичный API. Ссылка на эту библиотеку можно найти here.

+0

Привет, да, я действительно переехал в эту библиотеку. Это вызывает проблемы. Я запускал SQLite.Net, и он работал, но на Android N появилось всплывающее сообщение о sqlite.so. Затем я поменялся на SQLite-net-plc, и теперь он убил оба моих Android и iOS проекта. Кажется странным, что все остальные работают. Я растерялся, чтобы потерять что-то. Ive провел около 1 дня worktrying, чтобы исправить это, но действительно застрял сейчас. –

+0

@PhillWiggins Затем нам нужно будет увидеть фактический код, чтобы узнать что-нибудь о проблеме. – hvaughan3

+0

Спасибо @ hvaughan3 Я добавил класс объекта и класс базы данных, используемые для создания таблиц. –