2017-01-04 12 views
4

私の既存のアプリケーションデータはSQliteにあります。私はSqliteからRealmにデータを移行しようとしています。私はデータを移行する方法をGoogleに伝えましたが、それに関連する解決策は見つかりませんでした。SqliteからRealm(Android)に移行

私は既存のアプリケーションのアップデート版を立ち上げる予定です。アプリを更新する際には、データをレルムに移行し、既存のSqliteデータベースを削除する必要があります。可能であれば、解決策をご紹介ください。

答えて

7

データベース(SqlLite)のTODOリストが格納されていて、それを領域DBに移行するとします。

TODOアイテムテーブルのSqlLiteインタフェース

interface TodoItemModel { 
    String CREATE_TABLE = "" 
      + "CREATE TABLE todo_list(\n" 
      + " _id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n" 
      + " name TEXT NOT NULL,\n" 
      + ")"; 
    String TABLE_NAME = "todo_item"; 

    //columns 
    String _ID = "_id"; 
    String NAME = "name"; 
} 

のToDo項目のレルムオブジェクト

public class TodoItem extends RealmObject { 

    @PrimaryKey 
    private Long _id; 
    private String name; 

    public TodoItem() { 
    } 

    public TodoItem(long id, String name) { 
     this._id = id; 
     this.name = name; 
    } 
} 

ステップ1インクリメントもしSQLiteOpenHelperを拡張するDBのバージョン(すなわち、以下に示すDbOpenHelperクラス)。

ステップ2. onUpgrade関数を使用するDbOpenHelperクラスでは、バージョンを確認し、すべてのSqlLiteデータレコードをレルムdbに格納できます。

final class DbOpenHelper extends SQLiteOpenHelper { 

    //private static final int PREVIOUS_VERSION = 1; 
    private static final int CURRENT_VERSION = 2; 

    public DbOpenHelper(Context context) { 
     super(context, "todo.db", null /* factory */, CURRENT_VERSION); 
    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(TodoItemModel.CREATE_TABLE); 
    } 


    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     if (oldVersion < CURRENT_VERSION) { 
      //get all the stored data in your db 
      List<TodoItem> list = select_all_items_for_list(db); 

      //open the realm transaction and store the list of todo's 
      Realm realm = Realm.getDefaultInstance(); 
      realm.beginTransaction(); 
      realm.insertOrUpdate(list); 
      realm.commitTransaction(); 
      //finally drop table 
      db.execSQL("DROP TABLE IF EXISTS " + TodoItemModel.TABLE_NAME); 
     } 
    } 

    private List<TodoItem> select_all_items_for_list(SQLiteDatabase db) { 
     List<TodoItem> list = new ArrayList<>(); 
     Cursor cursor = db.rawQuery("select * from " + TodoItemModel.TABLE_NAME, new String[0]); 

     if (cursor == null) 
      return list; 

     for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { 
      final TodoItem todoItem = new TodoItem(cursor.getLong(cursor.getColumnIndex(TodoItemModel._ID)), cursor.getString(cursor.getColumnIndex(TodoItemModel.NAME)); 
      list.add(todoItem); 
     } 
     cursor.close(); 

     return list; 
    } 
} 
+0

私に何かが不足している場合は教えてください。 –

+0

私はしようとします。あなたのソリューションに感謝します。 –

+0

解決策があなたの質問に答えている場合は、答えとしてマークしてください。 –

関連する問題