android ormlite no such table的bug

来源:互联网 发布:火柴人联盟数据修改 编辑:程序博客网 时间:2024/06/11 23:20

虽然这几天工作繁忙,但是被一个莫名的bug折腾了半天,我还是本着分享的精神,让广大developer不再像我这么蛋疼,在这里记录下这个bug以及解决的方法.

 由于图方便原因在项目中使用了ORM开源框架ormlite,对于这个框架使用的还不熟练,今天遇到一个bug,用了很长的时间才解决,用过ormlite的同学应该知道这个框架建表的方法了,首先创建Dao,然后再实例化dao,在需要的地方使用dao中的dao.queryForId(id)这个方法来插入数据的同时也会在SQLITE中新建一个表,这个时候问题来了,比如现在有3张表A,B,C,开始你向A,B中插入了数据也新建了表,项目总是需要调试的,当你再次运行程序,准备插入C表,并且新建数据时,你会发现始终都无法建立C表到SQLITE中,一直报一个错,no such table(数据库中没有这张表),然后你会反复的看自己的代码,看javabean,看dao,你发现没错啊,可是就是无法新建表,无法插入数据了,这个时候其实有个很简单的解决方法:1,卸载你的APP,重新run.

                                         2.进入DDMS,到data/data目录下找到该工程的目录,手动删除掉你刚刚建立的这个数据库

 究其原因应该是因为创建表的代码导致的,我代码如下:

package com.eshore.express.db;import java.sql.SQLException;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import com.eshore.express.AppContext;import com.eshore.express.common.Constant;import com.eshore.express.model.AddressList;import com.eshore.express.model.OrderList;import com.eshore.express.model.UserList;import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;import com.j256.ormlite.support.ConnectionSource;import com.j256.ormlite.table.TableUtils;public class DBHelper extends OrmLiteSqliteOpenHelper {private static DBHelper instance = new DBHelper();public static DBHelper getInstance() {return instance;}public DBHelper() {super(AppContext.getContext(), Constant.DB_NAME, null, 1);// 初始化数据库}@Overridepublic void onCreate(SQLiteDatabase arg0, ConnectionSource arg1) {// 创建表try {TableUtils.createTableIfNotExists(connectionSource, UserList.class);TableUtils.createTableIfNotExists(connectionSource,AddressList.class);TableUtils.createTableIfNotExists(connectionSource, OrderList.class);} catch (SQLException e) {e.printStackTrace();}}@Overridepublic void onUpgrade(SQLiteDatabase arg0, ConnectionSource arg1, int arg2,int arg3) {// 更新表}/** * 清空表操作 */public void clear() {try {TableUtils.clearTable(connectionSource, UserList.class);TableUtils.clearTable(connectionSource, AddressList.class);TableUtils.clearTable(connectionSource, OrderList.class);} catch (SQLException e) {e.printStackTrace();}}}


看看onCreate()这个创建表的方法,所有的表都是在这个方法里面创建的,那么当我在创建表A的时候,表B和表C也相应的被创建了,但是创建A的时候,C的数据格式和表的字段还没有定义出来,那么之后你再插入数据的时候也就没有这张表,又或者你的实体类中的注解字段改变了,也无法插入数据生成C表,所以就会出现no such table,以上只是自己的见解,表达的也不够清楚,有疑问的童鞋可以留言讨论

具体的原因有时间了去研究下ormlite的源码,现在将这个问题记录下来,让遇到这个问题的同学不在抓狂

                                          

0 0