2012-08-31 2 views
2

방금 ​​Android 응용 프로그램을 개발하기 시작했으며이 오류로 만났고 어디에서 잘못했는지 모릅니다. 내 사용자가 성공적으로 로그인 할 때 나는 세부 사항을 잡을 수 있도록 내 사용자의 로그인 정보를 삽입 할SQLiteDatabase 오류 : 테이블에 열 이름이 없습니다

이 내 로그 캣이다. 이것은 내의 SQLiteDatabase 코드 패키지 com.stts

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 

입니다 .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(); 
} 
} 

오류의 원인이되는 문제점을 알고 싶습니다. 도와주세요! 감사!

+0

당신이 초기 테스트 후 테이블을 변경 했 :

이 메시지와 함께 예외가 발생합니다? 에서와 같이 열을 추가 하시겠습니까? – Swayam

+0

예. 표를 수정 한 경우 데이터를 삭제해야 할 수 있습니다. – Proxy32

+0

no. 나는 login이라는 이름의 테이블을 사용한다. 그리고 cname을 추가 열로 추가했습니다. 이 칼럼에 추가 한 후 애플리케이션이 다운되었습니다. 근본 원인이 무엇인지 알 수 있습니까? –

답변

2

NOT NULL 제약 조건을 추가하거나 KEY_CNAME 열을 추가 할 수있는 것처럼 스키마를 변경하면 OpenHelper에 이러한 변경 사항을 알릴 필요가 있습니다. 그것은 것을 자동으로 검색하지 않습니다.

private static final int DATABASE_VERSION = 2; 

당신은 INTEGER PRIMARY KEY 열에 "5040ef44839a09.93014710"를 삽입하려고 이렇게하는 가장 쉬운 방법은 데이터베이스를 업그레이드하고 있습니다. 일반적으로 SQLite는 데이터 유형 선호도 만 사용하지만 SQLite는 기본 키에 대해 엄격한 데이터 유형 일치를 사용합니다. "Error: datatype mismatch"

+0

나는 NULL이 아닌 데이터베이스 버전 = 2를 사용하지 않았습니다. –

+0

지금 다른 오류가 발생하고 있습니까? – Sam

+0

입력 데이터베이스 버전 = 2, 나는 테이블 로그인 문제를 cname 문제라는 이름의 열이 해결합니다. 하지만 내 사용자의 홈페이지로 이동하지는 않습니다. –

관련 문제