Android: Sqlite Exception aucune une telle table?

J'ai décidé que je déteste SQL et pour cela je suis en train de faire une classe d'aide que je peux réutiliser encore et encore et ne jamais avoir à jouer avec elle à nouveau, mais il ne fonctionne pas!

Voici ce que j'ai en ce moment:

DBAssistant.java

    public class DBAssistant {
SQLiteDatabase db = null;
public DBAssistant (){      
}
/** Opens database **/
public void openDB(Context context, String name){
db = new DBOpenHelper(context, name, DB_VERSION);
}
/** Creates the table "tableName" with the columns contained in "cols" **/
public void createTable(String tableName, String[] cols){
String table = "CREATE TABLE IF NOT EXISTS " + tableName + " (";
int numOfColums = cols.length;
columnNames = cols;
for (int i = 0; i < (numOfColums - 1); i++){
table += cols[i] + " VARCHAR, ";
}
table += cols[numOfColums - 1] + " VARCHAR);";
try{
db.execSQL("" + table);
System.out.println("ExecSQL:" + table);
} catch(Exception e){
System.out.println(e);
}
System.out.println("Column names: ");
for (String c : getColNames(tableName)){
System.out.print(c + " ");
}
}
/** Inserts "data" into new row **/
public void insertRow(String tableName, String[] data){
int cols = getCols(tableName);
System.out.println("if ((data.length) = " + (data.length) + ") ==" +
" (getCols(tableName) = " +  getCols(tableName) + ")?");
if (data.length == cols){
System.out.println("Inside if loop");
String cmd = "INSERT INTO " + tableName + " (";
for (int i = 0; i < cols - 1; i++){
cmd += getColNames(tableName)[i] + ", ";
}
cmd += getColNames(tableName)[cols - 1] + ") VALUES ('";
for (int k = 0; k < data.length - 1; k++){
cmd += data[k] + "', '";
}
cmd += "');";
System.out.println(cmd);
db.execSQL(cmd);
}
else{
System.out.println("Inside else loop");
String dat = "";
String sCols = "";
for (String d : data)
dat += "'" + d + "'";
for (String c : getColNames(tableName))
sCols += "'" + c + "'";
System.out.println("-------------------");
System.out.println("[insertRow] ERROR: Number of elements in data[" + dat + "]");
System.out.println("doesnt match the number of columns [" + cols + "] in " + tableName);
System.out.println("-------------------");
}           
}
/** Return String[] containing the column names in tableName **/
public String[] getColNames(String tableName){
Cursor c = db.rawQuery("SELECT * FROM " + tableName , null);
return c.getColumnNames();
}
/** Returns the number of rows in tableName **/
public int getCols(String tableName){
return getColNames(tableName).length;
}
/***  Other methods that have no relevance here .... ***/
private static class DBOpenHelper extends SQLiteOpenHelper {
DBOpenHelper(Context context, String dbName, int dbVersion) {
super(context, dbName, null, dbVersion);
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// Do Nothing
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
// Do Nothing
}
}
}

J'ai inclus plusieurs Système..println() déclarations pour m'aider à déboguer le code et trouver des problèmes, de sorte s'il vous plaît ignorer. PrintDB est un autre test que j'ai écrit que j'utilise pour s'assurer que tout fonctionne. Maintenant, c'est ce que j'ai écrit pour s'assurer que tout fonctionne....

DBAssistant db = new DBAssistant();
String dbName = "testing";
String tableName = "test";
String[] cols = {"_num", "num_eng", "num_span"};
String[] row1 = {"1", "one", "uno"};
String[] row2 = {"2", "two", "dos"};
String[] row3 = {"3", "three", "tres"};
String[] row4 = {"4", "four", "quatro"};
String[] row5 = {"5", "five", "cinco"};
TextView databaseView = (TextView)findViewById(R.id.databaseView);
db.openDB(this, dbName);
db.createTable(tableName, cols);
db.insertRow(tableName, row1);
db.insertRow(tableName, row2);
db.insertRow(tableName, row3);
db.insertRow(tableName, row4);
db.insertRow(tableName, row5);
databaseView.setText(db.printTable(tableName));

L'exécution de ce code, tout va très bien et de tout le Système..println() les états ont le droit de l'information jusqu'à ce qu'il arrive à la databaseView.setText(db.printTable(tableName));
et il déclenche une exception

ERREUR/AndroidRuntime(3440): android.la base de données.sqlite.SQLiteException: no such table: test: , lors de la compilation: SELECT * from test

Pointant vers la ligne dans le printTable() méthode:

Cursor c = dbr.rawQuery("SELECT * FROM " + tableName , null);

Cela m'a tellement confus parce que même ligne de code est utilisé dans le getColNames() méthode qui a été appelé à plusieurs reprises avant et a couru sans problème. Aussi, si la table n'existe pas, ne serait-il pas jeté une exception quand j'ai appelé insertRow()? J'ai appelé cette méthode 5 fois dans une rangée avec pas une seule exception levée! Ce qui se passe ici?


Edit:

Mettre en œuvre onCreate() dans votre DBOpenHelper. Y mettre le contenu de la createTable() la méthode.

Pourquoi serait-il nécessaire de créer la table dans le onCreate() méthode? Si je devais faire ce que je peux utiliser ma méthode existante pour le faire et il suffit d'appeler à partir de cette méthode?

Et la seconde, pourquoi vous n'utilisez pas les fournisseurs de contenu et d'uri >concept qui est déjà SQLless?

Wha...? Je n'ai aucune idée. Veuillez expliquer ce que c'est ou me laisser un lien vers une sorte de tutoriel.

Si exception dit qu'il n'y a pas de table avec un tel nom, alors c';s vrai, avez-vous vérifié avec la bad outil de console? Et la deuxième, pourquoi vous n'utilisez pas les fournisseurs de contenu et d'uri concept qui est déjà SQLless?
J'ai eu le même cas. Même si le nom de la table est correcte, mais quand même eu une SQLException. (pas de table)
Autant que je sache, le fournisseur de contenu peut ne pas être nécessaire dans certains cas.

OriginalL'auteur Dead_Jester | 2010-11-13