无法创建sqlite的第二个表 [英] Unable to create second table in sqlite

查看:136
本文介绍了无法创建sqlite的第二个表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从博客,论坛,网页尝试所有可能的解决方案后,我想出了这个问题。

起初我创建了一个表registrationTable数据库中,我能够做所有的CRUD操作。然后我试图添加第二个表purposeTable,这是没有得到,由于某些原因产生。

我曾尝试做以下的事情:

更改的数据库版本

改create语句第二个表格

列入PRAGMA foreign_keys = ON;作为第二个表包含一个外键

交换CDATE字段的数据类型从文本到日期,反之亦然。

但仍表是非受造的。

我DBAdapter类的code是如下:

  //表1
私有静态最后弦乐TAG =DBAdapter;
私有静态最后弦乐DATABASE_TABLE =registrationTable;
私有静态最后弦乐DATABASE_NAME =project1database;
私有静态最终诠释DATABASE_VERSION = 1;
私有静态最后弦乐DATABASE_CREATE =
    CREATE TABLE registrationTable(电话整数主键不为空,名称文本不为空,+
    年龄整数不为空,区文不为空,性别文字NOT NULL);;//表2
私有静态最后弦乐PURPOSE_TABLE =purposeTable;
私有静态最后弦乐PURPOSE_CREATE =创建表purposeTable(电话整数NOT NULL,外键(手机)引用registrationTable(手机),+
        CDATE文本不为空,主键(电话,日期),文本1文本不为空,文本2文本不是null);;私人最终上下文的背景下;
私人SQLiteDatabase分贝;
私人DatabaseHelper DBHelper;公共DBAdapter(上下文CTX){
    上下文= CTX;
}
//公共DBAdapter阅读()抛出的SQLException
//公共DBAdapter的write()抛出的SQLException
//公共无效的close()
//众长insertDetails(字符串名称,诠释年龄,串区,诠释手机,串性别)众长insertPurpose(日期字符串,字符串文本1,字符串文本2){
    ContentValues​​ initialValues​​1 =新ContentValues​​();
    initialValues​​1.put(CDATE,日期);
    initialValues​​1.put(文本1,文本1);
    initialValues​​1.put(TEXT2,文本2);
    返回db.insert(PURPOSE_TABLE,空,initialValues​​1);
}私有静态类DatabaseHelper扩展SQLiteOpenHelper {    公共DatabaseHelper(上下文的背景下){
        超(背景下,DATABASE_NAME,空,DATABASE_VERSION);
    }    @覆盖
    公共无效的onCreate(SQLiteDatabase DB){
        尝试{
            db.execSQL(DATABASE_CREATE);
            db.execSQL(PURPOSE_CREATE);
            db.execSQL(PRAGMA foreign_keys = ON;);
        }赶上(的SQLException E){
            e.printStackTrace();
        }
    }    @覆盖
    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){
        Log.w(TAG,从版本升级+ oldVersion +到+ + NEWVERSION所有数据将被删除。);
        db.execSQL(DROP TABLE IF EXISTS registrationTable);
        db.execSQL(DROP TABLE IF EXISTS purposeTable);
        的onCreate(DB);
    }
}

和我打电话从其他类中的方法insertPurpose()与低于code:

  dbAdapter2.write();
dbAdapter2.insertPurpose(CDATE,文本1,文本2);
dbAdapter2.close();

而logcat的日志如下:

  1月11日至17日:29:17.023:I / SqliteDatabaseCpp(15095):sqlite的返回:错误code = 1,味精=没有这样的表:purposeTable,DB = /数据/数据​​/ com.android.project1 /数据库/ project1database
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):错误插入的text1 =一个文本2 = B = CDATE 17-11-2011
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):android.database.sqlite.SQLiteException:没有这样的表:purposeTable:,在编译:?INSERT INTO purposeTable(文本1,文本2,CDATE)VALUES(, ?)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteCompiledSql.native_compile(本机方法)
11-17 01:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteCompiledSql<&初始化GT;(SQLiteCompiledSql.java:64)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1745)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1618)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在com.android.project1.DBAdapter.insertPurpose(DBAdapter.java:113)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在com.android.project1.Purpose3Activity $ 1.onClick(Purpose3Activity.java:51)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.view.View.performClick(View.java:3460)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.view.View $ PerformClick.run(View.java:13955)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.os.Handler.handleCallback(Handler.java:605)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.os.Handler.dispatchMessage(Handler.java:92)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.os.Looper.loop(Looper.java:137)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在android.app.ActivityThread.main(ActivityThread.java:4340)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在java.lang.reflect.Method.invokeNative(本机方法)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在java.lang.reflect.Method.invoke(Method.java:511)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
1月11日至17日:29:17.143:E / SQLiteDatabase(15095):在dalvik.system.NativeStart.main(本机方法)

在此先感谢,如果有人可以告诉我,我要去哪里错了。

第二表被创建,但数据尚未插入,新的日志:

  11月11日至17日:42:11.281:E / SQLiteDatabase(10172):错误插入的text1 = E文本2 = D CDATE = 17-11-2011
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):android.database.sqlite.SQLiteConstraintException:错误code 19:约束失败
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.database.sqlite.SQLiteStatement.native_executeInsert(本机方法)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1745)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1618)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在com.android.project1.DBAdapter.insertPurpose(DBAdapter.java:113)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在com.android.project1.Purpose3Activity $ 1.onClick(Purpose3Activity.java:51)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.view.View.performClick(View.java:3460)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.view.View $ PerformClick.run(View.java:13955)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.os.Handler.handleCallback(Handler.java:605)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.os.Handler.dispatchMessage(Handler.java:92)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.os.Looper.loop(Looper.java:137)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在android.app.ActivityThread.main(ActivityThread.java:4340)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在java.lang.reflect.Method.invokeNative(本机方法)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在java.lang.reflect.Method.invoke(Method.java:511)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11月11日至17日:42:11.281:E / SQLiteDatabase(10172):在dalvik.system.NativeStart.main(本机方法)


解决方案

我的感觉是有其创建目的表中的句子一定的误差。尝试在shell执行它,看看它是否工作。

当你在一个数据库中有几个表,我个人的建议是使用不同类不同的表,并利用了一句:

CREATE TABLE IF NOT EXISTS tableName值

而不是
CREATE TABLE表名

和覆盖的方法DataBaseHelper的的OnOpen。​​

它会使你的code更清晰,易于调试。

http://www.jiahaoliuliu.com/ 2011/09 / SQLite的创建,多表-with.html

After trying all the possible solutions from blogs, forums, web pages, I've come up with this question.

Initially I created a database with a table "registrationTable", and I was able to do all the CRUD operations. Then I tried to add a second table "purposeTable", which is not getting created due to some reason.

I have tried doing the following things:

changed the database version

changed the create statement for the second table

included "PRAGMA foreign_keys = ON;" as the second table contains a foreign key

swapped the datatype of "cdate" field from text to date and vice-versa

but still the table is uncreated.

The code of my DBAdapter class is as below:

 //Table 1
private static final String TAG = "DBAdapter";
private static final String DATABASE_TABLE = "registrationTable";
private static final String DATABASE_NAME = "project1database";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = 
    "create table registrationTable ( phone integer primary key not null, name text not null, " +
    "age integer not null, area text not null, sex text not null);";

//Table 2
private static final String PURPOSE_TABLE = "purposeTable";
private static final String PURPOSE_CREATE = "create table purposeTable ( phone integer not null, foreign key (phone) references registrationTable(phone), " +
        "cdate text not null, primary key (phone, date), text1 text not null, text2 text not null);";

private final Context context;
private SQLiteDatabase db;
private DatabaseHelper DBHelper;

public DBAdapter(Context ctx){
    context = ctx;
}
//public DBAdapter read()throws SQLException
//public DBAdapter write()throws SQLException
//public void close()
//public long insertDetails(String name, int age, String area, int phone, String sex)

public long insertPurpose(String date, String text1, String text2){
    ContentValues initialValues1 = new ContentValues();
    initialValues1.put(CDATE, date);
    initialValues1.put(TEXT1, text1);
    initialValues1.put(TEXT2, text2);
    return db.insert(PURPOSE_TABLE, null, initialValues1);
}

private static class DatabaseHelper extends SQLiteOpenHelper{

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        try{
            db.execSQL(DATABASE_CREATE);
            db.execSQL(PURPOSE_CREATE);
            db.execSQL("PRAGMA foreign_keys = ON;");
        }catch(SQLException e){
            e.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Upgrading from version " + oldVersion + " to " + newVersion + ". All data will be deleted.");
        db.execSQL("DROP TABLE IF EXISTS registrationTable");
        db.execSQL("DROP TABLE IF EXISTS purposeTable");
        onCreate(db);
    }
}

And am calling the method insertPurpose() from another class with the below code:

dbAdapter2.write();
dbAdapter2.insertPurpose(cDate, text1, text2);
dbAdapter2.close();

And the logcat log is as below:

11-17 01:29:17.023: I/SqliteDatabaseCpp(15095): sqlite returned: error code = 1, msg = no such table: purposeTable, db=/data/data/com.android.project1/databases/project1database
11-17 01:29:17.143: E/SQLiteDatabase(15095): Error inserting text1=a text2=b cdate=17-11-2011 
11-17 01:29:17.143: E/SQLiteDatabase(15095): android.database.sqlite.SQLiteException: no such table: purposeTable: , while compiling: INSERT INTO purposeTable(text1,text2,cdate) VALUES (?,?,?)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:112)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1745)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1618)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at com.android.project1.DBAdapter.insertPurpose(DBAdapter.java:113)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at com.android.project1.Purpose3Activity$1.onClick(Purpose3Activity.java:51)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.view.View.performClick(View.java:3460)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.view.View$PerformClick.run(View.java:13955)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.os.Handler.handleCallback(Handler.java:605)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.os.Looper.loop(Looper.java:137)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at android.app.ActivityThread.main(ActivityThread.java:4340)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at java.lang.reflect.Method.invokeNative(Native Method)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at java.lang.reflect.Method.invoke(Method.java:511)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-17 01:29:17.143: E/SQLiteDatabase(15095):    at dalvik.system.NativeStart.main(Native Method)

Thanks in advance, if somebody can tell me where am I going wrong.

Second table is created, but data is not inserted, new log:

11-17 11:42:11.281: E/SQLiteDatabase(10172): Error inserting text1=e text2=d cdate=17-11-2011
11-17 11:42:11.281: E/SQLiteDatabase(10172): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1745)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1618)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at com.android.project1.DBAdapter.insertPurpose(DBAdapter.java:113)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at com.android.project1.Purpose3Activity$1.onClick(Purpose3Activity.java:51)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.view.View.performClick(View.java:3460)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.view.View$PerformClick.run(View.java:13955)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.os.Handler.handleCallback(Handler.java:605)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.os.Looper.loop(Looper.java:137)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at android.app.ActivityThread.main(ActivityThread.java:4340)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at java.lang.reflect.Method.invokeNative(Native Method)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at java.lang.reflect.Method.invoke(Method.java:511)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-17 11:42:11.281: E/SQLiteDatabase(10172):    at dalvik.system.NativeStart.main(Native Method)

解决方案

My feeling is there is some error in the sentence which creates the purpose table. Try to execute it in a shell to see if it works.

When you have several tables in one database, my personal recommendations is use different classes for different tables and utilize the sentence:

CREATE TABLE IF NOT EXISTS tableName

instead of CREATE TABLE tableName

and override the method onOpen of DataBaseHelper.

It will make your code much more clear and easy to debug.

http://www.jiahaoliuliu.com/2011/09/sqlite-create-multiple-tables-with.html

这篇关于无法创建sqlite的第二个表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆