如何为sqlite操作构建更有效的设计

时间:2015-10-10 07:16:07

标签: android database sqlite oop

我正在研究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?是什么方式?

2 个答案:

答案 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));
    }
}

怎么可能?