2012-05-26 3 views
1

Я пытаюсь получить мое приложение для отображения информации, которая находится в таблице, которую я установил в моей базе данных. Из того, что я собираю, база данных настроена правильно, а код правильный, но я не знаю, что вызывает ошибку. Я выложу весь код, чтобы увидеть, может ли кто-нибудь здесь помочь мне понять.Невозможно отобразить базу данных в ListView

Progress.class: Помощник

public class WorkoutProgress extends ListActivity { 
    private DataBaseHelper datasource; 
    TextView goal; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.progress); 
     goal = (TextView)findViewById(R.id.goal); 
     datasource = new DataBaseHelper(this); 
     datasource.open(); 
     fillData(); 
     datasource.close(); 
    } 
    private void fillData() { 
    Cursor c = datasource.getAllActs(); 
    startManagingCursor(c); 
    String[] from = new String[] {DataBaseHelper.KEY_DATE, 
    DataBaseHelper.KEY_STEPS,DataBaseHelper.KEY_CALs }; 
    int[] to = { R.id.code, R.id.Days, R.id.BMI }; 
    SimpleCursorAdapter notes = new SimpleCursorAdapter (this, R.layout.notes_row, c, from, to); 
    setListAdapter(notes);    
    } 
} 

База данных:

public class DataBaseHelper 
{ 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_GOAL = "goal"; 
    public static final String KEY_Current = "cweight"; 
    public static final String KEY_Target = "nweight"; 

    public static final String KEY_ROWID2 = "_id"; 

    public static final String KEY_DATE = "date"; 
    public static final String KEY_STEPS = "steps"; 
    public static final String KEY_CALs = "calories"; 
    public static final String KEY_CALID = "_id"; 
    public static final String KEY_TOTALCALS = "totalcals";  
    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 String CALTABLE = "cals"; 
    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_CREATE = 
    "create table goals (_id integer primary key autoincrement, " 
    + "goal text not null, cweight number not null, " 
    + "nweight number not null);"; 
    private static final String DATABASE_CREATE2 = 
     "create table acts (_id integer primary key autoincrement, " 
       + "date text not null, steps text not null, " 
       + "calories number 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); 
     } 
    }  
    public DataBaseHelper open() throws SQLException 
    { 
     db = DBHelper.getWritableDatabase(); 
     return this; 
    } 
    public void close() 
    { 
     DBHelper.close(); 
    } 
    public long insertTitle(String goal, int current, int target) 
    { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_GOAL, goal); 
     initialValues.put(KEY_Current, current); 
     initialValues.put(KEY_Target, target); 
     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    public long insertActivity(String date, String steps, double 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); 
    } 
    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 getAllGoals() 
{ 
    return db.query(DATABASE_TABLE, new String[] { 
      KEY_ROWID, 
      KEY_GOAL, 
      KEY_Current, 
      KEY_Target}, 
      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 getGoal 
(long rowId) throws SQLException 
{ 
    Cursor mCursor = 
      db.query(true, DATABASE_TABLE, new String[] { 
        KEY_ROWID, 
        KEY_GOAL, 
        KEY_Current, 
        KEY_Target 
        }, 
        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; 
     } 
/*public boolean updateCals(long rowId, double cals) 
     { 
      ContentValues args = new ContentValues(); 
      args.put(KEY_TOTALCALS, cals); 
      return db.update(CALTABLE, args, 
          KEY_CALID + "=" + rowId, null) > 0; 
     }*/ 

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

Logcat:

05-26 14:42:03.895: E/AndroidRuntime(345): FATAL EXCEPTION: main 
05-26 14:42:03.895: E/AndroidRuntime(345): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.b00348312.workout/com.b00348312.workout.WorkoutProgress}: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, date, steps, calories FROM acts 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.os.Looper.loop(Looper.java:123) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.app.ActivityThread.main(ActivityThread.java:4627) 
05-26 14:42:03.895: E/AndroidRuntime(345): at java.lang.reflect.Method.invokeNative(Native Method) 
05-26 14:42:03.895: E/AndroidRuntime(345): at java.lang.reflect.Method.invoke(Method.java:521) 
05-26 14:42:03.895: E/AndroidRuntime(345): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
05-26 14:42:03.895: E/AndroidRuntime(345): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
05-26 14:42:03.895: E/AndroidRuntime(345): at dalvik.system.NativeStart.main(Native Method) 
05-26 14:42:03.895: E/AndroidRuntime(345): Caused by: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, date, steps, calories FROM acts 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264) 
05-26 14:42:03.895: E/AndroidRuntime(345): at com.b00348312.workout.DataBaseHelper.getAllActs(DataBaseHelper.java:168) 
05-26 14:42:03.895: E/AndroidRuntime(345): at com.b00348312.workout.WorkoutProgress.fillData(WorkoutProgress.java:30) 
05-26 14:42:03.895: E/AndroidRuntime(345): at com.b00348312.workout.WorkoutProgress.onCreate(WorkoutProgress.java:25) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
05-26 14:42:03.895: E/AndroidRuntime(345): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
05-26 14:42:03.895: E/AndroidRuntime(345): ... 11 more 

Глядя на л ogcat, кажется, говорит мне, что мне не хватает столбца "_id", но я изменил базу данных, чтобы включить этот столбец, который вы можете увидеть в приведенном выше справочном коде базы данных. Есть что-то, что я пропустил?

ответ

1

Возможно, вы изменили базу данных, указав нужный столбец, но эти изменения не будут фактически реализованы в базе данных до тех пор, пока не будет вызван метод onCreate или вы внесете изменения в метод onUpgrade и измените версию базы данных.

Попробуйте удалить и снова установить приложение на эмулятор/телефон, так что метод onCreate для вашей реализации SQLiteOpenHelper вызывается снова.

+0

, похоже, это не работает как обновление базы данных, переустановка ее дает те же ошибки logcat. Я запускал это не только на своем телефоне, но и на других телефонах и эмуляторе со всеми, дающими те же результаты после внедрения новой базы данных. –

+0

@DarrenMurtagh. Вы удалили все данные (с помощью «Очистить данные») перед повторной установкой приложения? – Luksprog

+1

Точка, которую я пытался сделать, это то, что набор результатов курсора должен содержать _id. Вы прошли и проверили это? – Simon

1

С активностью не запускать ошибки, основная причина еще ниже в стеке. В вашем случае, здесь:

05-26 14:42:03.895: E/AndroidRuntime(345): Caused by: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, date, steps, calories FROM acts 

Кажется, что само собой разумеющееся? См. here

Ключевым моментом является то, что ваш курсор должен содержать столбец с именем _id в наборе результатов, либо из реального столбца, либо из одного псевдонима.

+0

но он содержит _id. его первичный ключ или таблицу он должен вытащить информацию из –

+0

, если изменение первичного ключа не является тем, что я должен был иметь, что мне нужно иметь с столбцом _id –

Смежные вопросы