我正在研究sqlite和android应用程序。有一个xml文件,我获取数据库,表,表计数,列类型的信息...当应用程序启动时,应创建所有表。表和表列没有特定的计数。所以我应该设计一个感知动态结构。其实我做的也是;未知表的动态sqlquery计数...留下一些简单的事情。
我的构造函数;
public Database(Context context,String tablename, String [] a) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.tables=a;
this.TABLE_NAME=tablename;
}
我的查询构建器,无论有多少表计数和类型......
private String querybuild(String [] ss){
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i<ss.length;i++){
if( i % 2 == 0){
stringBuilder.append(ss[i]);
stringBuilder.append(" ");
}
if(i % 2 == 1){
stringBuilder.append(ss[i]);
if(i!=ss.length-1)
stringBuilder.append(",");
}
}
String finalString = stringBuilder.toString();
return "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "("
+finalString+")";
}
是onCreate方法。也许我应该第二次打电话,我不知道......
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(querybuild(tables));
}
所以有意义。在创建应用程序的地方,代码就在这里;
SQLiteDatabase dbp= new Database(getApplicationContext(),"table1",new String[]{ "ID","INTEGER PRIMARY KEY AUTOINCREMENT","cola","TEXT NOT NULL","colb","TEXT"}).getWritableDatabase();
SQLiteDatabase dbc= new Database(getApplicationContext(),"table2",new String[]{ "_ID","INTEGER PRIMARY KEY AUTOINCREMENT","col1","TEXT NOT NULL","col2","TEXT","col3","TEXT"}).getWritableDatabase();
第一个dbp变量正在运行,即创建tables1的表名。但是第二个变量dbc不会创建表。所以我的设计不好......
我知道onupgrade的数据库版本。但已经app正在开始新的,我希望第一次创建所有表。我应该第二次调用onCreate方法吗?或者我应该更改数据库版本并使用onupgrade?是什么方式?
答案 0 :(得分:0)
SQLiteOpenHelper
旨在用于结构已知的数据库。
无论如何,你的问题是你使用onCreate
错了;它的职责是创建整个数据库。
所以你必须处理那里的所有表格:
@Override
public void onCreate(SQLiteDatabase db) {
// ... get list of tables ...
for (each table) {
db.execSQL(querybuild(table));
}
}
如果您无法以这种方式编写onCreate
,则无法使用SQLiteOpenHelper
并且必须直接使用普通SQLiteDatabase
对象。
答案 1 :(得分:0)
有什么帮助吗?
@Override
public void onCreate(SQLiteDatabase db) {
// ... get list of tables ...
for (each table) {
db.execSQL(querybuild(table));
}
}
怎么可能?