LoginSignup
24
22

More than 5 years have passed since last update.

SQLiteにMapオブジェクトを保存(おすすめはActiveAndroid)

Last updated at Posted at 2014-05-27

チャオ!
SQLiteにMapオブジェクトを突っ込みたい場合ってあるあるですよね!

MapをSQLiteに保存

そういう場合は

Map → JSONObject → String

で保存して

String → JSONObject → Map

で読み込むのがおすすめ!

MapからStringに

MapからStringは超簡単♪

public String mapToJsonString(Map data) {
    if (data == null) {
        return null;
    }
    return new JSONObject(data).toString();
}

StringからMapに

StringからMapはちょっと面倒

public Map jsonStringToMap(String data) {
    if (data == null) {
        return null;
    }
    try {
        JSONObject json = new JSONObject(data);
        Iterator<Object> keys = json.keys();
        Map<String, Object> params = new HashMap<String, Object>();
        while (keys.hasNext()) {
            String key = keys.next().toString();
            String val = json.getString(key);
            params.put(key, val);
        }

        return params;
    } catch (JSONException e) {
        return null;
    }

    return null;
}

これでももうMapを保存し放題だね!

ActiveAndroidを使う場合

ナウなヤングはandroidでsqliteを使う場合ORMを使っていると思うけど、
おすすめはActiveAndroid

  • 勝手にできるIdが微妙
  • 複数のxxx.dbは使えない(?)

とか色々アレな所もあるけど、それを上回る魅力が!

で、ActivieAndroidでMapオブジェクトを保存するには

  1. 独自TypeSerializerを用意する
  2. AndroidManifest.xmlに一行追加

の2ステップだけで保存し放題!

1.独自TypeSerializerを用意する

好きな所にTypeSerializerを継承したMapSerializer.javaを保存

MapSerializer.java
package com.mypackage;

import com.activeandroid.serializer.TypeSerializer;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MapSerializer extends TypeSerializer {

    @Override
    public Class<?> getDeserializedType() {
        return Map.class;
    }

    @Override
    public Class<?> getSerializedType() {
        return String.class;
    }

    @Override
    public String serialize(Object data) {
        if (data == null) {
            return null;
        }
        return new JSONObject((Map)data).toString();
    }

    @Override
    public Map deserialize(Object data) {
        if (data == null) {
            return null;
        }
        try {
            JSONObject json = new JSONObject((String) data);
            Iterator<Object> keys = json.keys();
            Map<String, Object> params = new HashMap<String, Object>();
            while (keys.hasNext()) {
                String key = keys.next().toString();
                String val = json.getString(key);
                params.put(key, val);
            }

            return params;
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }
}

2.AndroidManifest.xmlに一行追加

AndroidManifest.xmlに下記を追記するれば準備完了!

AndroidManifest.xml
<meta-data android:name="AA_SERIALIZERS" android:value="com.mypackage.MapSerializer" />

例えば更にDateを保存するためのDateSerializerを追加した場合は

AndroidManifest.xml
<meta-data android:name="AA_SERIALIZERS" android:value="com.mypackage.Dateerializer,com.mypackage.MapSerializer" />

って感じで追加すればいい感じ。

使ってみる

あとはモデルで普通にMapを指定しておけばOKOK!

@Table(name = "myTable")
public class MyTable extends Model {

    @Column(name = "data")
    public Map data;
}
24
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
22