2017-09-23 2 views
0

J'ai créé 4 tables sur mon application. Ci-dessous est la création de la dernière table -pourquoi je ne parviens pas à créer cette table sur android SQLite?

c'est la requête que je reçois après l'analyse syntaxique de la chaîne

CREATE TABLE SINON EXISTE TABLE_1 (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, TEXT PK_Person NOT NULL , FOREIGN KEY (PK_Person) REFERENCES TABLE_2, COLUMN_INDEX_AS_TEXT TEXTE NON NULL, FOREIGN KEY (COLUMN_INDEX_AS_TEXT) REFERENCES TABLE_3);

Quand je lance cette méthode de création - je reçois une exception que la valeur proche de la COLUMN_INDEX_AS_TEXT est

Code d'erreur: 1 (SQLITE_ERROR) causés par: erreur ou base de données manquante SQL (requête). (près de "COLUMN_INDEX_AS_TEXT": erreur de syntaxe (code 1):, lors de la compilation: CREATE TABLE SINON EXISTE ..... (la requête)

Je vérifie et tout le tableau que je crée ce tableau avant coexisteront .

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()); 
    } 

Répondre

0

Vous devez créer ou appeler créer sur les premières tables référencées avant de créer ce tableau avec plusieurs clés étrangères

Je l'ai testé la requête en utilisant la classe SQLiteOpenHelper voir ci-dessous.

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

j'ai créé la table avant – Yanshof

+0

heirarchy sur le code, appelez la création de la table des deux autres premiers avez-vous ?. –

+1

oui oui oui .. je l'ai fait - j'ai créé et je vérifie aussi si cela a été fait en ajoutant un élément dans ce tableau – Yanshof

2

Dans SQL comme compris par sqlite, les contraintes de table telles que FOREIGN KEY suivent les spécifications de colonne. Vous ne pouvez pas les mélanger. Déplacez les spécifications FOREIGN KEY à la fin de votre CREATE TABLE afin que la spécification de colonne COLUMN_INDEX_AS_TEXT soit devant eux.

+0

mais j'ajoute la table spécifique que je veux étranger à (avec la colonne) - et je l'ai créée – Yanshof

0

ceci est votre code:

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 + ");"; 

ajouter une référence à la table, mais pas trouvé le nom de la colonne. vous pouvez essayer:

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+")");";