2012-08-31 3 views
2

Je viens de commencer à développer une application android et j'ai rencontré cette erreur et je ne sais pas où j'ai fait mal. Je veux insérer les informations de connexion de mon utilisateur afin que je puisse saisir les détails lorsque mon utilisateurERREUR SQLiteDatabase: la table n'a pas de nom de colonne

connecté avec succès dans Ceci est mon logcat.

09-01 01:08:13.874: E/JSON(294): {"tag":"login","success":1,"error":0,"uid":"5040ef44839a09.93014710","user":{"name":"a","cname":"a","email":"[email protected]","created_at":"2012-09-01 01:07:16","updated_at":null}} 
09-01 01:08:14.034: E/Database(294): Error inserting uid=5040ef44839a09.93014710 created_at=2012- 09-01 01:07:16 [email protected] cname=a name=a 
09-01 01:08:14.034: E/Database(294): android.database.sqlite.SQLiteException: table login has no column named cname: , while compiling: INSERT INTO login(uid, created_at, email, cname, name) VALUES(?, ?, ?, ?, ?); 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:36) 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1145) 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536) 
09-01 01:08:14.034: E/Database(294): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410) 
09-01 01:08:14.034: E/Database(294): at com.stts.sparetimetradingsystem.library.DatabaseHandlerEmployer.addUser(DatabaseHandlerEmployer.java:83) 
09-01 01:08:14.034: E/Database(294): at com.stts.sparetimetradingsystem.employer.LoginEmployerActivity$LoginEmployer$1.run(LoginEmployerActivity.java:134) 
09-01 01:08:14.034: E/Database(294): at android.os.Handler.handleCallback(Handler.java:587) 
09-01 01:08:14.034: E/Database(294): at android.os.Handler.dispatchMessage(Handler.java:92) 
09-01 01:08:14.034: E/Database(294): at android.os.Looper.loop(Looper.java:123) 
09-01 01:08:14.034: E/Database(294): at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-01 01:08:14.034: E/Database(294): at java.lang.reflect.Method.invokeNative(Native Method) 
09-01 01:08:14.034: E/Database(294): at java.lang.reflect.Method.invoke(Method.java:521) 
09-01 01:08:14.034: E/Database(294): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
09-01 01:08:14.034: E/Database(294): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
09-01 01:08:14.034: E/Database(294): at dalvik.system.NativeStart.main(Native Method) 
09-01 01:08:15.174: E/AndroidRuntime(294): FATAL EXCEPTION: main 
09-01 01:08:15.174: E/AndroidRuntime(294): java.lang.RuntimeException: Unable to destroy activity {com.stts.sparetimetradingsystem/com.stts.sparetimetradingsystem.employer.HomepageEmployerActivity}: java.lang.NullPointerException 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3655) 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673) 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.app.ActivityThread.access$2900(ActivityThread.java:125) 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.os.Looper.loop(Looper.java:123) 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-01 01:08:15.174: E/AndroidRuntime(294): at java.lang.reflect.Method.invokeNative(Native Method) 
09-01 01:08:15.174: E/AndroidRuntime(294): at java.lang.reflect.Method.invoke(Method.java:521) 
09-01 01:08:15.174: E/AndroidRuntime(294): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
09-01 01:08:15.174: E/AndroidRuntime(294): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
09-01 01:08:15.174: E/AndroidRuntime(294): at dalvik.system.NativeStart.main(Native Method) 
09-01 01:08:15.174: E/AndroidRuntime(294): Caused by: java.lang.NullPointerException 
09-01 01:08:15.174: E/AndroidRuntime(294): at com.stts.sparetimetradingsystem.employer.HomepageEmployerActivity.onDestroy(HomepageEmployerActivity.java:340) 
09-01 01:08:15.174: E/AndroidRuntime(294): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642) 
09-01 01:08:15.174: E/AndroidRuntime(294): ... 11 more 

Ceci est mon code SQLiteDatabase com.stts de paquet .sparetimetradingsystem.library;

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DatabaseHandlerEmployer extends SQLiteOpenHelper { 

// All Static variables 
// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "stts"; 

// Login table name 
private static final String TABLE_LOGIN = "login"; 

// Login Table Columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_NAME = "name"; 
private static final String KEY_CNAME = "cname"; 
private static final String KEY_EMAIL = "email"; 
private static final String KEY_UID = "uid"; 
private static final String KEY_CREATED_AT = "created_at"; 

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

// Creating Tables 
@Override 
public void onCreate(SQLiteDatabase dbe) { 
    // ORIGINAL 
    /*String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," 
      + KEY_NAME + " TEXT," 
      + KEY_CNAME + " TEXT," 
      + KEY_EMAIL + " TEXT UNIQUE," 
      + KEY_UID + " TEXT," 
      + KEY_CREATED_AT + " TEXT" + ")"; 

    dbe.execSQL(CREATE_LOGIN_TABLE);*/ 

    // TESTING HERE 
    dbe.execSQL("CREATE TABLE " + TABLE_LOGIN + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," 
      + KEY_NAME + " TEXT NOT NULL," 
      + KEY_CNAME + " TEXT," 
      + KEY_EMAIL + " TEXT UNIQUE NOT NULL," 
      + KEY_UID + " TEXT NOT NULL," 
      + KEY_CREATED_AT + " TEXT NOT NULL);" 
      );  
} 

// Upgrading database 
@Override 
public void onUpgrade(SQLiteDatabase dbe, int oldVersion, int newVersion) { 
    // Drop older table if existed 
    dbe.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN); 

    // Create tables again 
    onCreate(dbe); 
} 

/** 
* Storing user details in database 
* */ 
//public void addUser(String name, String email, String uid, String created_at) { 
public void addUser(String name, String cname, String email, String uid, String created_at) { 
    SQLiteDatabase dbe = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(KEY_NAME, name); // Name 
    values.put(KEY_CNAME, cname); // CName 
    values.put(KEY_EMAIL, email); // Email 
    values.put(KEY_UID, uid); // UID 
    values.put(KEY_CREATED_AT, created_at); // Created At 

    // Inserting Row 
    dbe.insert(TABLE_LOGIN, null, values); 
    dbe.close(); // Closing database connection 
} 

/** 
* Getting user data from database 
* */ 
/*public HashMap<String, String> getUserDetails(){ 
    HashMap<String,String> user = new HashMap<String,String>(); 
    String selectQuery = "SELECT * FROM " + TABLE_LOGIN; 

    SQLiteDatabase dbe = this.getReadableDatabase(); 
    Cursor cursor = dbe.rawQuery(selectQuery, null); 
    // Move to first row 
    cursor.moveToFirst(); 
    if(cursor.getCount() > 0){ 
     user.put("name", cursor.getString(1)); 
     user.put("cname", cursor.getString(2)); 
     user.put("email", cursor.getString(3)); 
     user.put("uid", cursor.getString(4)); 
     user.put("created_at", cursor.getString(5)); 
    } 
    cursor.close(); 
    dbe.close(); 
    // return user 
    return user; 
}*/ 
public String getCName() 
{ 
    String[] col = new String[] {KEY_NAME}; 
    SQLiteDatabase dbe = this.getReadableDatabase(); 
    Cursor c = dbe.query(TABLE_LOGIN, col, null, null, null, null, null); 
    String res = ""; 
    int iCname = c.getColumnIndex(KEY_NAME); 
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) 
    { 
     res = res + c.getString(iCname); 
    } 
    c.close(); 
    dbe.close(); 
    return res; 
} 

public String getEmail() 
{ 
    String[] col = new String[] {KEY_EMAIL}; 
    SQLiteDatabase dbe = this.getReadableDatabase(); 
    Cursor c = dbe.query(TABLE_LOGIN, col, null, null, null, null, null); 
    String res = ""; 
    int iEmail = c.getColumnIndex(KEY_EMAIL); 
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) 
    { 
     res = res + c.getString(iEmail); 
    } 
    c.close(); 
    dbe.close(); 
    return res; 
} 

/** 
* Getting user login status 
* return true if rows are there in table 
* */ 
public int getRowCount() { 
    String countQuery = "SELECT * FROM " + TABLE_LOGIN; 
    SQLiteDatabase dbe = this.getReadableDatabase(); 
    Cursor cursor = dbe.rawQuery(countQuery, null); 
    int rowCount = cursor.getCount(); 
    dbe.close(); 
    cursor.close(); 

    // return row count 
    return rowCount; 
} 

/** 
* Re crate database 
* Delete all tables and create them again 
* */ 
public void resetTables(){ 
    SQLiteDatabase dbe = this.getWritableDatabase(); 
    // Delete All Rows 
    dbe.delete(TABLE_LOGIN, null, null); 
    dbe.close(); 
} 
} 

Je veux savoir où est le problème à l'origine de l'erreur. aidez s'il vous plaît! Merci!

+0

Avez-vous changé vous table après les premiers essais? Comme dans, en ajoutant des colonnes? – Swayam

+0

Oui, vous devrez peut-être effacer les données si vous aviez modifié la table. – Proxy32

+0

no. J'utilise la même table nommée login. et j'ai ajouté dans cname comme ma colonne supplémentaire. Après avoir ajouté dans cette colonne mon application s'est écrasée. puis-je savoir quelle est la cause première? –

Répondre

2

Lorsque vous modifiez votre schéma, comme en ajoutant les contraintes NOT NULL ou en ajoutant éventuellement la colonne KEY_CNAME, vous devez informer votre OpenHelper de ces modifications. Il ne les trouvera pas automatiquement. La meilleure façon de le faire est mise à niveau de votre base de données:

private static final int DATABASE_VERSION = 2; 

Vous essayez d'insérer "5040ef44839a09.93014710" dans une colonne INTEGER PRIMARY KEY. Normalement, SQLite utilise uniquement l'affinité de type de données, mais SQLite utilise une correspondance de type de données stricte pour les clés primaires.

Cela lancera une exception avec le message: "Error: datatype mismatch"

+0

j'ai essayé de mettre en NULL et la version de la base de données = 2 n'aide pas –

+0

Avez-vous une erreur différente maintenant? – Sam

+0

J'ai entré la version de base de données = 2, je résous la connexion de table n'a aucune colonne nommée problème de cname. MAIS, je ne peux pas accéder à la page d'accueil de mon utilisateur. –

Questions connexes