关于android的sqlite数据库创建表的诡异事件

y3wegy 2011-04-12 07:00:45
在下面代码里面,我为什么每次创建数据库的时候数据表总是无缘无故的消失了,对表操作就会报错。
AndroidRuntime(418): Caused by: java.lang.IllegalStateException: database not open错误。
代码如下:

package demo.android;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SubjectAdapter {
private static final String KEY_ROWID="Id";

private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;

public static String[] C={"第一、二节课","第三、四、五节课","第六、七、八课","第九、十、十一课"};

public static final String DATABASE_NAME = "database";
public static final String DATABASE_TABLE = "subject";
private static final int DATABASE_VERSION = 1;

private final Context mCtx;

public class DatabaseHelper extends SQLiteOpenHelper {


DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

//建库
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
StringBuilder str=new StringBuilder();
str.append("create table ").append(DATABASE_TABLE).append("(Id integer primary key autoincrement,");
for(int i=0;i<C.length-1;i++)
{
str.append(C[i]);
str.append(" text,");
}
str.append(C[C.length-1]+" text");
str.append(")");
System.out.println(str.toString());
db.execSQL(str.toString());
initSubject(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
onCreate(db);
}
public void initSubject(SQLiteDatabase mDb) {
ContentValues initialValues = new ContentValues();
for(int i=0;i<5;i++)
{
for(int j=0;j<C.length;j++)
{
initialValues.put(C[j], " ");
}
System.out.println("创建第"+i+"行");
mDb.insert(DATABASE_TABLE, null, initialValues);
}
mDb.close();
}
}

public SubjectAdapter(Context ctx) {
this.mCtx=ctx;
}

public void open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
}
public Cursor getSubject(int rowId,int cId) throws SQLException {
//query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
Cursor mCursor =
mDb.query(true, DATABASE_TABLE, new String[]{C[cId-1]}, KEY_ROWID + "=" + rowId, null, null,
null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
mDb.close();
return mCursor;
}

public void updateSubject(int rowId, int i, String subject) {
ContentValues args = new ContentValues();
args.put(C[i-1], subject);
mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null);
mDb.close();
}
}

每次运行都会输出,也就是说每次都对表初始化了,间接说明表subject一直没有创建成功。但是既然没有创建成功,为什么输出的 i 可以正常输出,i是在建表subject并对其初始化的时候输出的
调用的时候是这样的:
SubjectAdapter mHelper=new SubjectAdapter(this);
mHelper.open();
运行到这里蓝色地方打代码就会报错。
哪位大虾知道为什么啊
...全文
1323 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhumengxiaoqi 2012-07-10
  • 打赏
  • 举报
回复
我的也有错误
y3wegy 2011-05-11
  • 打赏
  • 举报
回复
现在可以了。原来是频繁的对数据库操作导致数据丢失。。。。。。。。 可能是数据库有问题
quikFinger 2011-05-05
  • 打赏
  • 举报
回复
duanxls@126.com
给我发信,我给你一份简单的文档,你会看明白的。
quikFinger 2011-05-05
  • 打赏
  • 举报
回复
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
onCreate(db);
}

因为你在这个方法中删除了原来的表。
超级码妖 2011-04-30
  • 打赏
  • 举报
回复
我在一个地方读取数据的时候也遇到同样的问题,不知道是怎么回事呀。

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧