2017-07-19 1 views
1

フォーム。しかし、彼らは自分のクラスのコレクションであるため、SQLiteはそれらを認識しません。論文を保存する最良の方法は何でしょうか?または私は何が間違っている。私のアプリでは、Xamarinは私が上に複数の私が保存したい私のアプリでObservableCollections、編集を有してい

並べ替えのようなものになります(もちろん、より多くのコードが内部にあります)

public partial class App : Application 
 
{ 
 
    static MyDatabase database; 
 
    
 
    public static MyDatabase Database 
 
    { 
 
    get 
 
    { 
 
     if (database == null) 
 
     { 
 
     database = new MyDatabase(DependencyService.Get 
 
<IFileHelper>().GetLocalFilePath("MyListSQLite.db3")); 
 
     } 
 
     return database; 
 
    } 
 
    } 
 
}

てMyDatabase:

public class MyDatabase 
 
{ 
 
    readonly SQLiteAsyncConnection database; 
 

 
    public MyDatabase(string dbPath) 
 
    { 
 
    database = new SQLiteAsyncConnection(dbPath); 
 
    database.CreateTableAsync<MyClass>().Wait(); 
 
    } 
 

 
    public Task<List<MyClass>> GetItemsAsync() 
 
    { 
 
    return database.Table<MyClass>().ToListAsync(); 
 
    } 
 

 
\t public Task<MyClass> GetItemAsync(int id) 
 
\t { 
 
\t \t return database.Table<MyClass>().Where(i => i.ID == id).FirstOrDefaultAsync(); 
 
\t } 
 

 
\t public Task<int> SaveItemAsync(MyClass item) 
 
\t { 
 
\t \t if (item.ID != 0) 
 
\t \t { 
 
\t \t \t return database.UpdateAsync(item); 
 
\t \t } 
 
\t \t else 
 
\t \t { 
 
\t \t \t return database.InsertAsync(item); 
 
\t \t } 
 
\t } 
 

 
\t public Task<int> DeleteItemAsync(MyClass item) 
 
\t { 
 
\t \t return database.DeleteAsync(item); 
 
\t } 
 

 
}

のMyClass:

public class MyClass : ObservableCollection<MyOtherClass> 
 
{ 
 
    [PrimaryKey, AutoIncrement] 
 
    public int ID { get; set; } 
 
}

MyOtherClass:コのための私たちのアプリケーションのほとんどで

public class MyOtherClass : BindableObject 
 
    { 
 
     [PrimaryKey, AutoIncrement] 
 
     public int ID { get; set; } 
 

 

 
     public static readonly BindableProperty ListNbrProperty = 
 
      BindableProperty.Create("ListNbr", typeof(int), typeof(MyOtherClass), default(int)); 
 

 
\t \t public int ListNbr 
 
\t \t { 
 
\t \t \t get { return (int)GetValue(ListNbrProperty); } 
 
\t \t \t set { SetValue(ListNbrProperty, value); } 
 
\t \t } 
 

 
     public bool IsMaster { get; set; } 
 

 
\t \t public static readonly BindableProperty ResizedPathProperty = 
 
      BindableProperty.Create("ResizedPath", typeof(String), typeof(MyOtherClass), default(String)); 
 

 
\t \t public String ResizedPath 
 
\t \t { 
 
      get { return (String)GetValue(ResizedPathProperty); } 
 
\t \t \t set { SetValue(ResizedPathProperty, value); } 
 
\t \t } 
 
... 
 
}

+0

これは、これを実行するための最良の方法ではないと思います。 MyOtherClassオブジェクトを保存したいと思うようです。コレクションがあなたのオブジェクトを表示すること以外は(ライブを表示または処理するためだけに)生きる理由がないと、 'database.InsertAll'または' databaseを使ってこれを行うことができます。 UpdateAll'をデータベースクラスに追加します。 –

答えて

0

、 mplexオブジェクトを作成するには、それらをJsonにシリアライズして文字列として格納できるようにします(あなたの場合NVarChar(MAX)?)。

public static async Task<ObservableList<string>> RetrieveList (string key) 
    { 
     try 
     { 
      // Retrieve your json string from your sql database 

      [retrieve from SQLdatabase Code goes here - returns EncryptedJson] 

      // In our case we decrypt it 
      var DecryptedJson = Cryptography.Crypto.Decrypt(EncryptedJson, Key); 
      var DeSerialisedData = JsonConvert.DeserializeObject<ObservableList<string>>(DecryptedJson); 

      return await Task.FromResult(DeSerialisedData ?? new ObservableList<string>()); 

     } 
     catch (Exception genEx) 
     { 
      var Error = genEx.Message; 
      return await Task.FromResult(new ObservableList<string>()); 
     } 
    } 

上記ISN:我々は常に、時には我々は

using Newtonsoft.Json;

public static async Task<bool> CacheList (ObservableList<string> MyList) 
    { 
     try 
     { 
      var json = JsonConvert.SerializeObject(MyList); 

      // you dont need to encrypt the string, but we deal with some 
      // sensitive data so we have a seperate cryptography class that handles this. 

      var EncryptedJson = Cryptography.Crypto.Encrypt(json, Key); 

      // Now you have your serialised object simply store it into your database using whatever method you usually user 

      [Store to SQLdatabase Code goes here] 

      return await Task.FromResult(true); 
     } 
     catch (Exception genEx) 
     { 
      var Error = genEx.Message; 
      return await Task.FromResult(false); 
     } 
    } 

(iOS用IE NSUserDefaults)ネイティブプロジェクト独自のストレージ・メカニズムを使用し、それを取得するには、SQLを使用していませんコピー&ペーストではなく、実際に使用する例があります。これは、アプリケーションで使用する概念のほうが、はるかに高いレベルです。

+0

ニースは、jsonについても考えていて、私はこれらの経験がないので、どちらが最善のアプローチだったのか分からなかった。 'ObservableCollection'にidを渡すために' MyClass'を作成しましたが、上記のように 'ObservableList 'で行うことは可能ですか? – Oliver

+0

もちろん、jsonのSerializeObjectメソッドは、複雑なオブジェクトを正確なjson表現でプロパティに分解します。 =) – Digitalsa1nt

関連する問題