无法创建任何SQLite / Android表

时间:2012-04-30 05:25:03

标签: android sqlite

由于主题暗示我在sqlite中创建新表时遇到一些问题。我用我的代码做什么我不能在db中创建新表。如果我看一下db,那就是android_metadata tb而已。创建新代码的代码是:

...
this.createTable(R.string.nametable, "_id INT PRIMARY KEY, " + "parentID INT, " + "name TEXT");
...

public void createTable(int id, String sql) {
        String table = this.getStringById(id);
        String _sql = "CREATE TABLE " + table + "(" + sql + ")";
        Log.d("Controller.createTable", _sql);
        this.mCurrentConnection.rawQuery(_sql, null);
        try {
            Cursor c = this.Select(id, "*", null);
            c.close(); 
            Log.d("Controller.createTable", "create finished");
        } catch (Exception e) {
            Log.d("Controller.createTable", "can't create table: " + table);
        }
    }

我在我的应用程序的构造函数中打开或创建数据库

if(this.mCurrentConnection == null || !this.mCurrentConnection.isOpen()) {
            this.mCurrentConnection = this.mContext.openOrCreateDatabase(this.mDB, Context.MODE_PRIVATE , null);
        }

我已经尝试了一切:更改db / tb的名称,重新安装应用程序,放置“;”或者不在命令的最后,尝试使用新的干净的vm。 我没有找到任何有用的现有帖子/答案来解决我的问题。 如果我执行_sql语句

CREATE TABLE name_table(_id INT PRIMARY KEY, parentID INT, name TEXT)
在phpmyadmin(MySQL)中,一切正常。

如果你能帮助我,我会很高兴。

问亚历克斯

编辑:(回答以下评论)

@VikramBodicherla:那就是概率。 create语句本身没有引起任何异常。 select(check)语句会抛出

  

04-30 07:34:14.834:E /数据库(305):插入parentid = -1时出错   名称=布拉布拉   04-30 07:34:14.834:E / Database(305):android.database.sqlite.SQLiteException:

     

没有这样的表:name_table :,编译时:INSERT INTO   name_table(parentid,name)VALUES(?,?); 04-30 07:34:14.834:   E /数据库(305):at   android.database.sqlite.SQLiteProgram.native_compile(Native方法)   04-30 07:34:14.834:E /数据库(305):at   android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)   04-30 07:34:14.834:E /数据库(305):at   android.database.sqlite.SQLiteProgram。(SQLiteProgram.java:59)   04-30 07:34:14.834:E /数据库(305):at   android.database.sqlite.SQLiteStatement。(SQLiteStatement.java:41)   04-30 07:34:14.834:E /数据库(305):at   android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1027)   04-30 07:34:14.834:E /数据库(305):at   android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1413)   04-30 07:34:14.834:E /数据库(305):at   android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1286)   04-30 07:34:14.834:E /数据库(305):at   unicorn.Heurazio.Controller.addName(Controller.java:156)04-30   07:34:14.834:E /数据库(305):at   unicorn.Heurazio.Controller.install(Controller.java:135)04-30   07:34:14.834:E /数据库(305):at   unicorn.Heurazio.StartUpActivity.onCreate(StartUpActivity.java:22)   04-30 07:34:14.834:E /数据库(305):at   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)   04-30 07:34:14.834:E /数据库(305):at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)   04-30 07:34:14.834:E /数据库(305):at   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)   04-30 07:34:14.834:E /数据库(305):at   android.app.ActivityThread.access $ 2200(ActivityThread.java:119)04-30   07:34:14.834:E /数据库(305):at   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1863)   04-30 07:34:14.834:E /数据库(305):at   android.os.Handler.dispatchMessage(Handler.java:99)04-30   07:34:14.834:E /数据库(305):at   android.os.Looper.loop(Looper.java:123)04-30 07:34:14.834:   E /数据库(305):at   android.app.ActivityThread.main(ActivityThread.java:4363)04-30   07:34:14.834:E /数据库(305):at   java.lang.reflect.Method.invokeNative(Native Method)04-30   07:34:14.834:E /数据库(305):at   java.lang.reflect.Method.invoke(Method.java:521)04-30 07:34:14.834:   E /数据库(305):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.runZygoteInit.java:860)   04-30 07:34:14.834:E /数据库(305):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)04-30   07:34:14.834:E /数据库(305):at   dalvik.system.NativeStart.main(原生方法)

2 个答案:

答案 0 :(得分:1)

你真的非常想要使用SQLiteOpenHelper类及其相关的pattern:它不仅仅用于升级,它还可以干净地创建表格。

此外,您的create语句可能如下所示:

CREATE TABLE name_table (_id  INTEGER PRIMARY KEY AUTOINCREMENT, parentID INTEGER, name TEXT)

编辑:从您的跟踪中,您的CREATE TABLE永远不会运行(因此该表不存在)。使用SQLiteOpenHelper和execSQL函数来创建表,你应该全部设置。

答案 1 :(得分:0)

04-30 07:34:14.834:E / Database(305):插入parentid时出错= -1 name = blabla 04-30 07:34:14.834:E / Database(305):android.database.sqlite。 SQLiteException:

根据您的错误堆栈,您是否尝试插入-1作为parentid? parentid是主键,不接受负值