虽然这几天工作繁忙,但是被一个莫名的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);// 初始化数据库
	}

	@Override
	public 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();
		}
	}

	@Override
	public 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的源码,现在将这个问题记录下来,让遇到这个问题的同学不在抓狂

                                          

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐