2019独角兽企业重金招聘Python工程师标准>>>
本来是在别人写的项目基础上升级修改的,读取源代码发现项目中运用到原生的SQLite API,也用到xutils的数据库api和 KJFrameForAndroid的数据库模块,感觉不好维护,就从网上了解能够快速入手,效率还不错的单一功能的数据库框架。
感觉greenDao和ORMLite都还不错,但是greenDao无从下手,项目又有一点急,所以就选择ORMLite 数据库api ,下面以项目中的消息模块为例。
用android studio开发,真的省了不少力,很快引入库和新建自己的数据库帮助类:
compile files('libs/ormlite-android-4.48.jar')
compile files('libs/ormlite-core-4.48.jar')
public class DataBaseHelper extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "market.db";
private static final int DATABASE_VERSION = 1;
private Dao messageDao = null;
public DataBaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
LogUtils.d("DatabaseHelper onCreate");
try {
// TableUtils.clearTable(connectionSource, MyMessage.class);
TableUtils.createTableIfNotExists(connectionSource, MyMessage.class);
} catch (SQLException e) {
e.printStackTrace();
LogUtils.e("can't create database", e);
}
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int oldVersion, int newVersion) {
LogUtils.d("DatabaseHelper onCreate");
try {
TableUtils.dropTable(connectionSource, MyMessage.class, true);
onCreate(sqLiteDatabase, connectionSource);
} catch (SQLException e) {
LogUtils.e("Can't drop databases", e);
throw new RuntimeException(e);
}
}
private static DataBaseHelper instance;
/**
* 单例获取该Helper
*
* @param context
* @return
*/
public static synchronized DataBaseHelper getHelper(Context context) {
context = context.getApplicationContext();
if (instance == null) {
synchronized (DataBaseHelper.class) {
if (instance == null)
instance = new DataBaseHelper(context);
}
}
return instance;
}
public synchronized Dao getDao() throws SQLException {
if (messageDao == null)
messageDao = getDao(MyMessage.class);
return messageDao;
}
/**
* 释放资源
*/
@Override
public void close() {
super.close();
if (messageDao != null)
messageDao = null;
}
}
又新建了MesageDao管理类:
public class MessageDao {
private Context context;
private Dao messageDao;
private DataBaseHelper helper;
private static final long PAGE_SIZE = 10L;
public MessageDao(Context context) {
this.context = context;
try {
helper = DataBaseHelper.getHelper(context);
messageDao = helper.getDao(MyMessage.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void insert(MyMessage msg) {
LogUtils.d("dao = " + messageDao + ",MyMessage = " + msg.toString());
try {
int value = messageDao.create(msg);
LogUtils.d("插入数据返回值:" + value);
} catch (SQLException e) {
e.printStackTrace();
}
}
public List findByPage(int page) throws SQLException {
QueryBuilder builder = messageDao.queryBuilder();
builder.orderBy("id", true);
builder.offset((page - 1) * PAGE_SIZE);
builder.limit(PAGE_SIZE);
return builder.query();
}
public List findAll() {
List messages = null;
try {
messages = messageDao.queryForAll();
} catch (SQLException e) {
e.printStackTrace();
}
return messages;
}
public void deleteById(int id) {
try {
int value = messageDao.deleteById(id);
LogUtils.d("删除一条数据返回值:" + value);
} catch (SQLException e) {
e.printStackTrace();
}
}
public void deleteByData(MyMessage msg) {
int value = 0;
try {
value = messageDao.delete(msg);
} catch (SQLException e) {
e.printStackTrace();
}
LogUtils.d("删除一条数据返回值:" + value);
}
public void deleteAll() {
try {
List messages = messageDao.queryForAll();
int value = 0;
if (messages != null && !messages.isEmpty()) {
value = messageDao.delete(messages);
}
LogUtils.d("删除所有数据返回值:" + value);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
数据库帮助类中onCreate中起初用的是注释的代码。以为就这样就完成,然后在Activity中引用,是适当的时候插入就可以了。但是并没有朝着自己的想法前进,收到消息,但是数据库中却没有一条数据,总是得到
no such table: tb_message
在StackOverFlow中找到http://stackoverflow.com/questions/30916126/android-ormlite-no-such-table-exception,然后修改onCreate创建表的方法,但是还是不行,一直包上面的错误。一步一步的执行,发现帮助类总是不执行onCreate方法, 感觉是因为已经存在数据库,所以不执行创建。于是,放测试机上面的项目删除,重新安装,然后就发现消息可以存储了,一切正常了,一切看起来是那么的美好!