Android使用ORMLite操作数据库(一)

Android App在持久保存数据时,会使用的数据库,一般用到默认的SQlite,但是在保存操作数据时并不是很方便,所以使用ORMLite操作数据库,不失为一种很好的选择。ORM即Object Relative Mapping,可以直接将对象保存到数据库中,非常方便。下面分享下自己学习的经验所得。本demo做了一个简单的会话页面,将每次的会话内容保存到数据库,再次打开该会话页面时,默认加载之前的会话。

Demo效果如下:

Android使用ORMLite操作数据库(一)_第1张图片

表内容如下:

Android使用ORMLite操作数据库(一)_第2张图片

一、包含所需的开源库,在gradle文件中添加

    compile 'com.j256.ormlite:ormlite-android:4.48'
    compile 'com.j256.ormlite:ormlite-core:4.48'

二、定义一个操作对象MsgModel,用于保存消息内容

/**
 * Date: 2016/5/11 17:48
 *
 * @author hornsey
 */
@DatabaseTable
public class MsgModel {

    private static int count = 0;

    private Random random = new Random();
    private String[] names = {"Mike", "Jack"};

    @DatabaseField(id = true)
    private int msgId;

    @DatabaseField
    private int userId;

    @DatabaseField
    private String nickName;

    @DatabaseField
    private String msg;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public int getMsgId() {
        return msgId;
    }

    public void setMsgId(int msgId) {
        this.msgId = msgId;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public MsgModel() {}

    public static void setBaseCount(int base) {
        MsgModel.count = base;
    }

    public MsgModel(String msg) {
        int i = random.nextInt(2);
        this.msgId = count++;
        this.userId = i;
        this.nickName = names[i];
        this.msg = msg;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("MsgModel{");
        sb.append("msg='").append(msg).append('\'');
        sb.append(", msgId=").append(msgId);
        sb.append(", userId=").append(userId);
        sb.append(", nickName='").append(nickName).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

代码中使用了简单的注解,字母意思清晰易懂。特别注意:在改对象中,必须指明一个域作为数据库的主key。本demo中使用的是msgId。


三、创建DataHelper,继承自OrmLiteSqliteOpenHelper

public class ORMLiteDemoApplication extends Application {
    private static final String TAG = "ORMLiteDemoApplication";

    private static ORMLiteDemoApplication instance;
    private static DataHelper dataHelper;

    public static ORMLiteDemoApplication getInstance() {
        if(instance == null) {
            synchronized (ORMLiteDemoApplication.class) {
                if(instance == null) {
                    instance = new ORMLiteDemoApplication();
                }
            }
        }

        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onTerminate() {
        destroyDataHelper();
        super.onTerminate();
    }

    public static synchronized DataHelper getDataHelper(Context c) {
        if (dataHelper == null) {
            dataHelper = OpenHelperManager.getHelper(c, DataHelper.class);
        }
        return dataHelper;
    }

    public static void destroyDataHelper() {
        if (null != dataHelper) {
            OpenHelperManager.releaseHelper();
            dataHelper = null;
            Log.d(TAG, "destroyDataHelper.dataHelper = " + dataHelper);
        }
    }
}

四、在Application中定义一个DataHelper静态实例

public class ORMLiteDemoApplication extends Application {
    private static final String TAG = "ORMLiteDemoApplication";

    private static ORMLiteDemoApplication instance;
    private static DataHelper dataHelper;

    public static ORMLiteDemoApplication getInstance() {
        if(instance == null) {
            synchronized (ORMLiteDemoApplication.class) {
                if(instance == null) {
                    instance = new ORMLiteDemoApplication();
                }
            }
        }

        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onTerminate() {
        destroyDataHelper();
        super.onTerminate();
    }

    public static synchronized DataHelper getDataHelper(Context c) {
        if (dataHelper == null) {
            dataHelper = OpenHelperManager.getHelper(c, DataHelper.class);
        }
        return dataHelper;
    }

    public static void destroyDataHelper() {
        if (null != dataHelper) {
            OpenHelperManager.releaseHelper();
            dataHelper = null;
            Log.d(TAG, "destroyDataHelper.dataHelper = " + dataHelper);
        }
    }
}

五、在会话页面操作数据库,查询数据或者写入数据

    private void writeNewMsgToDB(MsgModel msgModel) {
        DataHelper dataHelper = ORMLiteDemoApplication.getDataHelper(context);

        try {
            dataHelper.getChatDao().createOrUpdate(msgModel);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //获取本地历史消息
    private void getHistoryMsg() {
        List localList = null;
        try {
            localList = ORMLiteDemoApplication.getDataHelper(context).getChatDao().queryForAll();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        Log.d(TAG, "getHistoryMsg.localList = " + localList);

        if(localList != null) {
            msgAdapter.addMsgList(localList);
            msgList.smoothScrollToPosition(msgAdapter.getCount()-1);
            MsgModel.setBaseCount(localList.size());
        }

    }







你可能感兴趣的:(Android)