Переход с Sqlite на Realm (Android)

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

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


person Ncit Cosmos    schedule 04.01.2017    source источник


Ответы (1)


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

Интерфейс SqlLite для таблицы элементов TODO

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

Объект области для элемента списка дел

 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 в базе данных области.

   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;
    }
}
person Dharmendra Pratap Singh    schedule 04.01.2017
comment
Дайте мне знать, если я что-то упустил. - person Dharmendra Pratap Singh; 04.01.2017
comment
Я попробую. Спасибо за ваше решение. - person Ncit Cosmos; 04.01.2017
comment
Отметьте это как ответ, если решение отвечает на ваш вопрос. - person Dharmendra Pratap Singh; 04.01.2017
comment
может кто-нибудь ответить на этот вопрос для быстрого в ios? - person Shuja Ud Din; 19.09.2018