日期:2014-05-20  浏览次数:20817 次

关于android的sqlite数据库创建表的诡异事件
在下面代码里面,我为什么每次创建数据库的时候数据表总是无缘无故的消失了,对表操作就会报错。
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();
运行到这里蓝色地方打代码就会报错。
哪位大虾知道为什么啊

------解决方案--------------------
我在一个地方读取数据的时候也遇到同样的问题,不知道是怎么回事呀。
------解决方案--------------------
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
// TODO Auto-generated method stub
db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);