2016-04-29 2 views
1

Я задал аналогичный вопрос раньше, но не был уверен, как это сказать. С тех пор я посмотрел несколько уроков и немного понял мою проблему. Я пытаюсь отобразить информацию из моей базы данных в виде списка, но не могу понять, как заставить ее работать. Любая помощь будет большой.ListView работает с базой данных в android

Это мой DataBase адаптер Класс:

public class DBAdapter { 

public static final String KEY_ROWID = "id"; 
public static final String KEY_TITLE = "title"; 
public static final String KEY_WORKOUTDATE = "workoutDate"; 
public static final String KEY_EXERCISE_NOTES = "notes"; 

private static final String TAG = "WorkoutDBAdapter"; 
private DatabaseHelper mDBHelper; 
private SQLiteDatabase mdb; 

private static final String DATABASE_NAME = "WorkoutDB"; 
private static final String DATABASE_TABLE = "workouts"; 
private static final int DATABASE_VERSION = 1; 

private final Context mCtx; 

private static final String DATABASE_CREATE = 
     "create table if not exists workouts " + 
       "(id integer primary key autoincrement, " + 
       "title VARCHAR not null, " + 
       "workoutDate date, " + 
       "notes VARCHAR);"; 

private static class DatabaseHelper extends SQLiteOpenHelper { 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.w(TAG, DATABASE_CREATE); 
     db.execSQL(DATABASE_CREATE); 
    } 

    @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 workouts"); 
     onCreate(db); 
    } 
} 


public DBAdapter(Context ctx) { 
    this.mCtx = ctx; 
} 


public DBAdapter open() throws SQLException { 
    mDBHelper = new DatabaseHelper(mCtx); 
    mdb = mDBHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    if (mDBHelper != null) { 
     mDBHelper.close(); 
    } 
} 

//---retrieves all the records--- 
public Cursor getAllRecords() { 
    Cursor mCursor = mdb.query(DATABASE_TABLE, new String[]{KEY_ROWID, KEY_TITLE, 
      KEY_WORKOUTDATE, KEY_EXERCISE_NOTES}, null, null, null, null, null); 

    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 
} 

} 

Это мой AndroidListViewCursorAdaptorActivity класс:

public class AndroidListViewCursorAdaptorActivity extends Activity { 

private DBAdapter dbHelper; 
private SimpleCursorAdapter dataAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.workouts); 

    dbHelper = new DBAdapter(this); 
    dbHelper.open(); 



    //Generate ListView from SQLite Database 
    displayListView(); 

} 

private void displayListView() { 


    Cursor cursor = dbHelper.getAllRecords(); 

    // The desired columns to be bound 
    String[] columns = new String[] { 
      DBAdapter.KEY_TITLE, 
      DBAdapter.KEY_WORKOUTDATE, 
      DBAdapter.KEY_EXERCISE_NOTES, 

    }; 

    // the XML defined views which the data will be bound to 
    int[] to = new int[] { 
      R.id.title, 
      R.id.workoutDate, 
      R.id.workoutDetails, 

    }; 

    // create the adapter using the cursor pointing to the desired data 
    //as well as the layout information 
    dataAdapter = new SimpleCursorAdapter(
      this, R.layout.workout_info, 
      cursor, 
      columns, 
      to, 
      0); 

    ListView listView = (ListView) findViewById(R.id.listView1); 
    // Assign adapter to ListView 
    listView.setAdapter(dataAdapter); 

    }; 


} 

Это файл XML, который держит макет, где данные должны идти (я думаю, что я 'не на 100%, если это правильный способ сделать это)

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:padding="6dip" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="Title: " 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/textView1" 
    android:layout_below="@+id/textView1" 
    android:text="WorkoutDate: " 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/textView3" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/textView2" 
    android:layout_below="@+id/textView2" 
    android:text="Workout Details" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/workoutDetails" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    android:layout_alignBottom="@+id/textView3" 
    android:layout_centerHorizontal="true" /> 

<TextView 
    android:id="@+id/workoutDate" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    android:layout_alignBottom="@+id/textView2" 
    android:layout_alignLeft="@+id/workoutDetails" 
    android:layout_alignStart="@+id/workoutDetails" /> 

<TextView 
    android:id="@+id/title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    android:layout_alignParentTop="true" 
    android:layout_alignLeft="@+id/workoutDetails" 
    android:layout_alignStart="@+id/workoutDetails" /> 

Херес тренировками XML с ListView1

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" android:layout_height="fill_parent" 
android:orientation="vertical"> 

<TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:padding="10dp" 
    android:text="@string/some_text" android:textSize="20sp" /> 

<EditText android:id="@+id/myFilter" android:layout_width="match_parent" 
    android:layout_height="wrap_content" android:ems="10" 
    android:hint="@string/some_hint"> 
    <requestFocus /> 
</EditText> 

<ListView android:id="@+id/listView1" android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 

Heres в StackTrace. Я получаю новое сообщение об ошибке?

04-30 08:05:52.741 2565-2565/course.labs.todomanager E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: course.labs.todomanager, PID: 2565 
                    java.lang.RuntimeException: Unable to start activity ComponentInfo{course.labs.todomanager/course.labs.todomanager.AndroidListViewCursorAdaptorActivity}: android.database.sqlite.SQLiteException: no such column: _id (code 1): , while compiling: SELECT _id, title, workoutDate, notes FROM workouts 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                     at android.os.Looper.loop(Looper.java:135) 
                     at android.app.ActivityThread.main(ActivityThread.java:5254) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at java.lang.reflect.Method.invoke(Method.java:372) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                    Caused by: android.database.sqlite.SQLiteException: no such column: _id (code 1): , while compiling: SELECT _id, title, workoutDate, notes FROM workouts 
                     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
                     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
                     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
                     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
                     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
                     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
                     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
                     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) 
                     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163) 
                     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034) 
                     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202) 
                     at course.labs.todomanager.DBAdapter.getAllRecords(DBAdapter.java:91) 
                     at course.labs.todomanager.AndroidListViewCursorAdaptorActivity.displayListView(AndroidListViewCursorAdaptorActivity.java:43) 
                     at course.labs.todomanager.AndroidListViewCursorAdaptorActivity.onCreate(AndroidListViewCursorAdaptorActivity.java:36) 
                     at android.app.Activity.performCreate(Activity.java:5990) 
                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)  
                     at android.app.ActivityThread.access$800(ActivityThread.java:151)  
                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)  
                     at android.os.Handler.dispatchMessage(Handler.java:102)  
                     at android.os.Looper.loop(Looper.java:135)  
                     at android.app.ActivityThread.main(ActivityThread.java:5254)  
                     at java.lang.reflect.Method.invoke(Native Method)  
                     at java.lang.reflect.Method.invoke(Method.java:372)  
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  
+0

Этот код не работает? – Pooya

+0

В чем проблема? приложение разбилось? ничего не отображается? Каков размер вашего курсора? ..... –

+0

Нет, этот код не работает. При попытке использования приложения произойдет сбой приложения. – Ryan159

ответ

1

Я не вижу ничего плохого в вашем коде, вы пробовали переустановить приложения? Чтобы изменения SQL были повторно проверены.

Примечание: Мой ответ является базовым в текущем EDIT и в ответ на текущие комментарии.

0

В вашем изменении заявления создания базы данных id колонок с _id

+0

Я пробовал это и получил это сообщение об ошибке. Причина: android.database.sqlite.SQLiteException: нет такого столбца: _id (код 1): при компиляции: SELECT _id, title, workoutDate, примечания FROM workouts – Ryan159

+0

Опубликуйте обновленный код строк. Что вы изменили? –

+0

вот что я изменил. public static final String KEY_ROWID = "_id"; и это «создать таблицу, если не существует тренировок» + »(_include integer primary key autoincrement,« + – Ryan159

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