2017-01-04 6 views
4

Мои существующие данные приложения находятся на SQlite. Я пытаюсь перенести данные из Sqlite в Realm. Я google как перенести данные, но не нашел решения, связанные с этим.Миграция из Sqlite в Realm (Android)

Я планирую запустить обновленную версию существующего приложения. При обновлении приложения данные должны мигрировать в Царство, а существующая база данных Sqlite должна быть удалена. По возможности, поделитесь идеей с решением.

ответ

7

Предположим, у вас есть список TODO в базе данных (SqlLite), и вы хотите перенести его в базу данных домена.

SqlLite интерфейс для таблицы TODO Item

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

Realm объектов для 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 (то есть: класс DbOpenHelper, указанный ниже).

Шаг 2. В классе DbOpenHelper с использованием функции onUpgrade вы можете проверить версию и сохранить все записи SqlLite Data в области 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

Отметьте это как ответ, если решение отвечает на ваш вопрос. –