Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Realm with ContentProvider

Realm with ContentProvider

I tried to implement realm-java with ContentProvider.

Takahiro Shimokawa

April 23, 2015
Tweet

More Decks by Takahiro Shimokawa

Other Decks in Programming

Transcript

  1. Realm with ContentProvider
    Realm meetup #2

    View Slide

  2. About me
    4 Լ઒ ܟ߂ (@androhi)
    4 גࣜձࣾZaim (AndroidΞϓϦ୲౰)
    4 DroidKaigiͰൃද͠·͢
    4 JellyBeanͱKitKatͰ࣮ݱ͢ΔϚςϦΞϧσβΠϯ

    View Slide

  3. Tried
    ContentProviderͰΞΫηε͢ΔDBΛɺRealmʹͯ͠Έ·͠
    ͨ
    Reason
    AndroidͷSyncAdapterΛ࢖ͬͨࣗಈಉظͷ࢓૊ΈͰ͸ɺό
    οΫάϥ΢ϯυͰಉظॲཧΛ͢ΔࡍʹContentProviderΛ༻
    ͍Δͱ͍͏ϧʔϧ͕͋ΔͨΊ

    View Slide

  4. View Slide

  5. Extend ContentProvider
    1. Queryϝιουͷ࣮૷ (+ ಠࣗCursorͷੜ੒)
    2. Insertϝιουͷ࣮૷
    3. Updateϝιουͷ࣮૷
    4. Deleteϝιουͷ࣮૷
    5. BulkInsertϝιουͷ࣮૷

    View Slide

  6. This time
    1. Queryϝιουͷ࣮૷ (+ ಠࣗCursorͷੜ੒)
    2. Insertϝιουͷ࣮૷
    3. Updateϝιουͷ࣮૷
    4. Deleteϝιουͷ࣮૷
    5. BulkInsertϝιουͷ࣮૷

    View Slide

  7. 1-1. Create cursor
    static final String[] sColumns = new String[] {"_id", "name", "price"};
    RealmQuery query = mRealm.where(Item.class);
    RealmResults results = query.findAll();
    MatrixCursor matrixCursor = new MatrixCursor(sColumns);
    for (Item item : results) {
    Object[] rowData =
    new Object[]{item.get_id(), item.getName(), item.getPrice()};
    matrixCursor.addRow(rowData);
    }

    View Slide

  8. 1-2. Implement query
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
    String[] selectionArgs, String sortOrder) {
    ...
    RealmQuery query = mRealm.where(Item.class);
    RealmResults results = query.findAll();
    MatrixCursor matrixCursor = new MatrixCursor(sColumns);
    for (Item item : results) {
    Object[] rowData =
    new Object[]{item.get_id(), item.getName(), item.getPrice()};
    matrixCursor.addRow(rowData);
    }
    return matrixCursor;
    }

    View Slide

  9. 2. Implement insert
    @Override
    public Uri insert(Uri uri, ContentValues contentValues) {
    ...
    mRealm.beginTransaction();
    Item item = mRealm.createObject(Item.class);
    item.set_id(++count);
    item.setName(contentValues.getAsString(sColumns[1]));
    item.setPrice(contentValues.getAsLong(sColumns[2]));
    mRealm.commitTransaction();
    return Uri.withAppendedPath(uri, String.valueOf(item.get_id()));
    }

    View Slide

  10. 5. Implement bulkInsert
    @Override
    public int bulkInsert(Uri uri, ContentValues[] values) {
    ...
    mRealm.beginTransaction();
    try {
    for (ContentValues value : values) {
    Item item = mRealm.createObject(Item.class);
    item.set_id(value.getAsLong(sColumns[0]));
    item.setName(value.getAsString(sColumns[1]));
    item.setPrice(value.getAsLong(sColumns[2]));
    }
    } finally {
    mRealm.commitTransaction();
    }
    return values.length;
    }

    View Slide

  11. compare with SQLite
    Query/Insert -> 10,000݅
    Xperia Z1f (Android 4.4.2)

    View Slide

  12. SQLite with
    ContentProvider
    4 Insert͸ɺ͔ͳΓ஗͍
    4 Query͕ૣ͍

    View Slide

  13. Realm with
    ContentProvider
    4 Insert͕ɺͦΜͳʹ஗͘ͳ͍
    4 Query͕SQLiteʹൺ΂Δͱ஗͍
    ʢCursorੜ੒ͷӨڹʣ
    4 BulkInsert͸ޓ֯ʁ

    View Slide

  14. View Slide

  15. View Slide

  16. View Slide

  17. Summary
    4 ύϑΥʔϚϯε͸མͪΔʢʁʣ͚ͲContentProviderͰ΋
    ࢖͑Δ
    4 Queryϝιου͸վળͷ༨஍͕͋Γͦ͏
    4 ࣗಈಉظ͚ͩContentProviderܦ༝ʹ͠ɺΞϓϦຊମ͸
    RealmΛͦͷ··࢖͏ͷ͕ྑͦ͞͏

    View Slide