2017-09-23 21 views
0

私は自分のアプリで4つのテーブルを作成しました。なぜ私はアンドロイドSQLite上でこのテーブルを作成できませんか?

これは私が文字列

、NOTはTABLE_1を存在する場合のCREATE TABLE(ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULLと、PK_PersonのTEXT NOT NULLの解析後に取得するクエリです - 以下は、最後のテーブルの作成です、FOREIGN KEY(PK_Person)REFERENCES TABLE_2、COLUMN_INDEX_AS_TEXT TEXT NOT NULL、外部キー(COLUMN_INDEX_AS_TEXT)REFERENCES TABLE_3);

私は創造のこの方法を実行する - 私は例外を取得COLUMN_INDEX_AS_TEXTに近い値が

エラーコードであること:1(SQLITE_ERROR) によって引き起こさ:SQL(クエリー)エラーまたは欠落しているデータベース。 ( "COLUMN_INDEX_AS_TEXT"の近く:構文エラー(コード1)::コンパイル中にテーブルが存在しない場合.....(クエリ)

このテーブルの前に作成したすべてのテーブルがチェックされています。

try 
    { 
     SQLiteDatabase db = getWritableDatabase(); 



String query = "CREATE TABLE IF NOT EXISTS " + TABLE_1 + "(" 
       + "ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," 
       + "PK_Person TEXT NOT NULL, FOREIGN KEY (PK_Person)" + " REFERENCES " + TABLE_2 + ", " 
       + COLUMN_INDEX_AS_TEXT + " TEXT NOT NULL, FOREIGN KEY(" + COLUMN_INDEX_AS_TEXT + ") REFERENCES " + TABLE_3 + ");"; 




db.execSQL(query); 
    } 
    catch (Exception e) 
    { 
     Log.e(TAG, e.getMessage()); 
    } 

答えて

0

作成または複数の外部キーでこのテーブルを作成する前に、最初に参照テーブルの上に作成する呼び出す必要があり

私はSQLiteOpenHelperクラスを使用してクエリをテストした下記を参照:。

public class DbHelper extends SQLiteOpenHelper { 

    private static final String DATABASENAME = "eeee.db"; 
    private static final int DATABASE_VERSION = 1; 
    private static final String TABLE_1 = "tb1"; 
    private static final String TABLE_2 = "tb2"; 
    private static final String TABLE_3 = "tb3"; 
    private static final String COLUMN_INDEX_AS_TEXT = "indexxx"; 

    public DbHelper(Context context) { 
     super(context, DATABASENAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase sqLiteDatabase) { 

     String mainquery = "CREATE TABLE IF NOT EXISTS " + TABLE_1 + "(" 
       + "ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," 
       + "PK_Person TEXT NOT NULL, FOREIGN KEY (PK_Person)" + " REFERENCES " + TABLE_2 + ", " 
       + COLUMN_INDEX_AS_TEXT + " TEXT NOT NULL, FOREIGN KEY(" + COLUMN_INDEX_AS_TEXT + ") REFERENCES " + TABLE_3 + ");"; 

     String query2 = "CREATE TABLE IF NOT EXISTS " + TABLE_2 + "(" 
       + "ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," 
       + "PK_Person TEXT NOT NULL);"; 

     String query = "CREATE TABLE IF NOT EXISTS " + TABLE_3 + "(" 
       + "ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," 
       + COLUMN_INDEX_AS_TEXT + " TEXT NOT NULL);"; 

     sqLiteDatabase.execSQL(query); 
     sqLiteDatabase.execSQL(query2); 
     sqLiteDatabase.execSQL(mainquery); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { 
// you can specify your own implementation here if db version incremented 
    } 
} 
+0

私はコードに – Yanshof

+0

階層の前にテーブルを作成しましたが、最初に他の2つのテーブルの作成を呼び出しましたか? –

+1

はいはいはい..私は - 私が作成したと私はまた、それらのテーブルにいくつかの要素を追加することによって行われたかどうかを確認します – Yanshof

2

sqliteが理解しているように、FOREIGN KEYなどの表の制約は列の指定に従います。それらを混在させることはできません。 CREATE TABLEの末尾にあるFOREIGN KEYの仕様を、COLUMN_INDEX_AS_TEXTの列仕様がその前になるように移動します。

+0

しかし、私は外に(列で)にしたい特定のテーブルを追加 - 私はそれを作成 – Yanshof

0

これはあなたのコードです:

String mainquery = "CREATE TABLE IF NOT EXISTS " + TABLE_1 + "(" 
      + "ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," 
      + "PK_Person TEXT NOT NULL, FOREIGN KEY (PK_Person)" + " REFERENCES " + TABLE_2 + ", " 
      + COLUMN_INDEX_AS_TEXT + " TEXT NOT NULL, FOREIGN KEY(" + COLUMN_INDEX_AS_TEXT + ") REFERENCES " + TABLE_3 + ");"; 

は、テーブルへの参照を追加しますが、列名が見つかりません。あなたは試してみることができます

String mainquery = "CREATE TABLE IF NOT EXISTS " + TABLE_1 + "(" 
      + "ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," 
      + "PK_Person TEXT NOT NULL, FOREIGN KEY (PK_Person)" + " REFERENCES " + TABLE_2 + ", " 
      + COLUMN_INDEX_AS_TEXT + " TEXT NOT NULL, FOREIGN KEY(" + COLUMN_INDEX_AS_TEXT + ") REFERENCES " + TABLE_3 + "("+COLUMN_NAME+")");"; 
関連する問題