2012-04-06 1 views
1

SQLite 데이터베이스를 설정했습니다. 그것은 내가 그것을 액세스해야하는 클래스를 실행할 때 응용 프로그램이 충돌하는 것 같습니다. 처음에 테이블 생성 문이 문제 였지만 그 오류가 해결 된 후에도 여전히 작동하지 않는다는 것이 나에게 지적되었습니다. 데이터베이스 설정은 다음과 같습니다 -Android SQLite 데이터베이스 설정 오류?

public class DataBaseHelper 
{ 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_CODE = "code"; 
    public static final String KEY_DAYS = "days"; 
    public static final String KEY_BMI = "bmi"; 
    public static final String KEY_ROWID2 = "id2"; 
    public static final String KEY_DATE = "date"; 
    public static final String KEY_STEPS = "steps"; 
    public static final String KEY_CALs = "calories"; 
    private static final String TAG = "DBAdapter"; 

    private static final String DATABASE_NAME = "workout"; 
    private static final String DATABASE_TABLE = "goals"; 
    private static final String DATATABLE = "acts"; 

    private static final int DATABASE_VERSION = 1; 

    private static final String DATABASE_CREATE = 
     "create table goals (_id integer primary key autoincrement, " 
     + "code text not null, days text not null, " 
     + "bmi text not null);"; 
    private static final String DATABASE_CREATE2 = 
     "create table acts (id2 integer primary key autoincrement, " 
       + "date text not null, steps text not null, " 
       + "calories text not null);"; 

    private final Context context; 

    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    public DataBaseHelper(Context ctx) 
    { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 
     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      db.execSQL(DATABASE_CREATE); 
      db.execSQL(DATABASE_CREATE2); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
     int newVersion) 
     { 
      Log.w(TAG, "Upgrading database from version " + oldVersion 
       + " to " 
       + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS titles"); 
      onCreate(db); 
     } 
    }  

//---opens the database--- 
    public DataBaseHelper open() throws SQLException 
    { 
     db = DBHelper.getWritableDatabase(); 
     return this; 
    } 

//---closes the database---  
    public void close() 
    { 
     DBHelper.close(); 
    } 

//---insert a title into the database--- 
    public long insertTitle(String isbn, String title, String publisher) 
    { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_CODE, isbn); 
     initialValues.put(KEY_DAYS, title); 
     initialValues.put(KEY_BMI, publisher); 
     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 
    public long insertActivity(String date, String steps, String Calories) 
    { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_DATE, date); 
     initialValues.put(KEY_STEPS, steps); 
     initialValues.put(KEY_CALs, Calories); 
     return db.insert(DATATABLE, null, initialValues); 
    } 

//---deletes a particular title--- 
    public boolean deleteTitle(long rowId) 
    { 
     return db.delete(DATABASE_TABLE, KEY_ROWID + 
      "=" + rowId, null) > 0; 
    } 
    public void deleteFirst() 
    { 
     Cursor cursor = db.query(DATABASE_TABLE, null, null, null, null, null, null); 

     if(cursor.moveToFirst()) { 
      long rowId = cursor.getLong(cursor.getColumnIndex(KEY_ROWID)); 

      db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null); 
     } 
    } 

    public boolean deleteAct(long rowId) 
    { 
     return db.delete(DATATABLE, KEY_ROWID + 
      "=" + rowId, null) > 0; 
    } 
//---retrieves all the titles--- 
    public Cursor getAllTitles() 
    { 
     return db.query(DATABASE_TABLE, new String[] { 
      KEY_ROWID, 
      KEY_CODE, 
      KEY_DAYS, 
      KEY_BMI}, 
      null, 
      null, 
      null, 
      null, 
      null); 
} 
public Cursor getAllActs() 
{ 
    return db.query(DATATABLE, new String[] { 
      KEY_ROWID2, 
      KEY_DATE, 
      KEY_STEPS, 
      KEY_CALs}, 
      null, 
      null, 
      null, 
      null, 
      null); 
} 

//---retrieves a particular title--- 
public Cursor getTitle(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATABASE_TABLE, new String[] { 
        KEY_ROWID, 
        KEY_CODE, 
        KEY_DAYS, 
        KEY_BMI 
        }, 
        KEY_ROWID + "=" + rowId, 
        null, 
        null, 
        null, 
        null, 
        null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 
public Cursor getAct(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATATABLE, new String[] { 
        KEY_ROWID2, 
        KEY_DATE, 
        KEY_STEPS, 
        KEY_CALs 
        }, 
        KEY_ROWID2 + "=" + rowId, 
        null, 
        null, 
        null, 
        null, 
        null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 
public boolean updateAct(long rowId, String date, 
     String steps, String cals) 
     { 
      ContentValues args = new ContentValues(); 
      args.put(KEY_DATE, date); 
      args.put(KEY_STEPS, steps); 
      args.put(KEY_CALs, cals); 
      return db.update(DATATABLE, args, 
          KEY_ROWID2 + "=" + rowId, null) > 0; 
     } 

//---updates a title--- 
    public boolean updateTitle(long rowId, String isbn, 
    String title, String publisher) 
    { 
     ContentValues args = new ContentValues(); 
     args.put(KEY_CODE, isbn); 
     args.put(KEY_DAYS, title); 
     args.put(KEY_BMI, publisher); 
     return db.update(DATABASE_TABLE, args, 
        KEY_ROWID + "=" + rowId, null) > 0; 
    } 
} 

및 로그 고양이는 : 나는 일이 나에게 문제를 말하고있다

04-06 17:20:14.561: E/AndroidRuntime(24550): FATAL EXCEPTION: main 
04-06 17:20:14.561: E/AndroidRuntime(24550): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.b00348312.workout/com.b00348312.workout.WorkoutProgress}: android.database.sqlite.SQLiteException: no such column: bmi: , while compiling: SELECT _id, code, days, bmi FROM goals 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.app.ActivityThread.access$2300(ActivityThread.java:135) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.os.Looper.loop(Looper.java:144) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.app.ActivityThread.main(ActivityThread.java:4937) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at java.lang.reflect.Method.invokeNative(Native Method) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at java.lang.reflect.Method.invoke(Method.java:521) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at dalvik.system.NativeStart.main(Native Method) 
04-06 17:20:14.561: E/AndroidRuntime(24550): Caused by: android.database.sqlite.SQLiteException: no such column: bmi: , while compiling: SELECT _id, code, days, bmi FROM goals 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1412) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1296) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1251) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1331) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at com.b00348312.workout.DataBaseHelper.getAllTitles(DataBaseHelper.java:131) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at com.b00348312.workout.WorkoutProgress.fillData(WorkoutProgress.java:27) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at com.b00348312.workout.WorkoutProgress.onCreate(WorkoutProgress.java:22) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069) 
04-06 17:20:14.561: E/AndroidRuntime(24550): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751) 
04-06 17:20:14.561: E/AndroidRuntime(24550): ... 11 more 

한 Statment입니다 :

04-06 17:20:14.561: E/AndroidRuntime(24550): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.b00348312.workout/com.b00348312.workout.WorkoutProgress}: android.database.sqlite.SQLiteException: no such column: bmi: , while compiling: SELECT _id, code, days, bmi FROM goals 

하지만 난 어떤 곳을 해달라고하지 필드 bmi가 호출 될 때마다 아무런 문제가없는 것처럼 보입니다. 내가 놓친 게 있니?

+0

해당 열이 없습니다. bmi in your database? –

+0

그래, 그것을 지적하지만 성명에서 dmi를 정의했습니다 'public static final String KEY_BMI = "bmi"; '그리고 그것은'개인 정적 최종 문자열 DATABASE_CREATE = "테이블 목표 (_id 정수 기본 키 autoincrement," + "코드 텍스트가 null이 아닌 일수가 아닌 텍스트," + "bmi text not null을 생성합니다.); "; ' –

답변

2

데이터베이스에서 "bmi"라는 열에 액세스하려고 시도했지만 존재하지 않습니다.

데이터베이스를 만든 후에 열을 추가하고 데이터베이스를 올바르게 업그레이드하기 위해 openHelper를 수정하지 않은 것 같습니다.

"bmi"필드를 추가하면 오류가 해결됩니다. 데이터베이스가 이미 존재하므로 Create 문을 변경하면 Create 문이 실행되지 않으므로 충분하지 않습니다. 한 데이터베이스 버전에서 다른 버전으로 변경하려면 "onUpgrade"를 재정의해야합니다.

현재 데이터베이스를 삭제하고 처음부터 다시 만드십시오.

+0

하지만 열 bmi가 있습니다.이 create 문에서'개인 정적 최종 문자열 DATABASE_CREATE = '테이블 목표 생성 (_id 정수 기본 키 자동 증가, " +"코드 텍스트가 널 (null) " +"bmi 텍스트가 널이 아님); "; ' –

+0

답변이 업데이트되었습니다. 위 참조. "Create"문은 데이터베이스가 처음 생성 될 때만 실행됩니다. – Kuffs

+0

이제 칼럼 '날짜'가 존재하지 않는다는 것을 알려주고 있습니다. 하지만 bmi와 날짜 모두 매우 처음부터 데이터베이스에있었습니다 –

1

onUpgrade를 구현하지 않으면 android가 데이터베이스를 변경하지 않기 때문에 응용 프로그램을 제거한 다음 다시 설치해야합니다.

또는 설정과 앱으로 이동하여 앱의 데이터를 지운 다음 앱을 실행하십시오.

관련 문제