2012-12-12 2 views
1

У меня есть исходный файл SQLiteHelper, который я использую для создания базы данных и всего этого. У меня есть еще один исходный файл, который должен создавать базу данных, извлекать данные и отображать их в пользовательском интерфейсе. Однако, когда я запускаю приложение на эмуляторе, приложение выходит из строя. Я не уверен, что случилось. В исходных файлах нет ошибок.Не удалось извлечь данные из базы данных SQLite и отобразить в действии

источник RestaurantDB файл

package com.demostudio.restaurants; 

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

public class RestaurantDB extends SQLiteOpenHelper { 

static final String dbName = "RestaurantDB"; 
static final Integer dbVersion = 1; 

static final String restaurantListTable = "RestaurantList"; 
static final String colRestaurantID = "RestaurantID"; 
static final String colRestaurantName = "RestaurantName"; 
static final String colRestaurantStore = "StoreNo"; 

public RestaurantDB(Context context) { 
super(context, dbName, null, dbVersion); 
// TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
// TODO Auto-generated method stub 

String newTableSQL = 
     "CREATE TABLE "+ 
     restaurantListTable+ 
     " ("+colRestaurantID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
     colRestaurantName+" TEXT NOT NULL, "+ 
     colRestaurantStore+" TEXT NOT NULL "+ 
     ");"; 
db.execSQL(newTableSQL); 

ContentValues cv = new ContentValues(); 
cv.put(colRestaurantName, "Restaurant AAA"); 
cv.put(colRestaurantStore, "1"); 
db.insert(restaurantListTable, null, cv); 

cv.put(colRestaurantName, "Restaurant BBB"); 
cv.put(colRestaurantStore, "2"); 
db.insert(restaurantListTable, null, cv); 

db.close(); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
// TODO Auto-generated method stub 

} 
} 

AllRestaurants исходный файл

package com.demostudio.restaurants; 

import android.app.ListActivity; 
import android.database.Cursor; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.widget.SimpleCursorAdapter; 

public class AllRestaurants extends ListActivity { 
RestaurantDB db = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_listview); 
db=new RestaurantDB(AllRestaurants.this);  
onPostExecute() ; 
} 

private Cursor doQuery() { 
return(db.getReadableDatabase().rawQuery("SELECT colRestaurantID AS _id, colRestaurantName, colRestaurantStore " 
+ "FROM RestaurantListTable ORDER BY colRestaurantName", null)); 

} 

public void onPostExecute() { 
SimpleCursorAdapter adapter; 

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) { 
    adapter=new SimpleCursorAdapter(this, R.layout.activity_all_restaurants, 
      doQuery(), new String[] { 
     RestaurantDB.colRestaurantName, 
     RestaurantDB.colRestaurantStore }, 
     new int[] { R.id.title, R.id.value }, 
     0); 
    } 
else { 
    adapter=new SimpleCursorAdapter(this, R.layout.activity_all_restaurants, 
      doQuery(), new String[] { 
     RestaurantDB.colRestaurantName, 
     RestaurantDB.colRestaurantStore }, 
     new int[] { R.id.title, R.id.value }); 
    } 


setListAdapter(adapter); 
} 
} 

activity_listview XML

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

activity_all_restaurants XML

<?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"> 

<TextView 
android:id="@+id/title" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentLeft="true" 
android:textSize="20sp" 
android:textStyle="bold"/> 

<TextView 
android:id="@+id/value" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentRight="true" 
android:textSize="20sp" 
android:textStyle="bold"/> 

</RelativeLayout> 

Файл журнала

12-13 14: 08: 52,805: Вт/трассировки (3861): Неожиданное значение от nativeGetEnabledTags: 0
12-13 14: 08: 52,805: Вт/следа (3861): Неожиданное значение из nativeGetEnabledTags: 0
12-13 14: 08: 54.795: D/dalvikvm (3861): GC_FOR_ALLOC освобожден 68K, 7% бесплатно 2670K/2860K, приостановлено 139ms, всего 143ms
12-13 14:08 : 54.826: I/dalvikvm-heap (3861): вырасти кучу (фрагмент) до 3.796MB для 1127536-байтового распределения
12-13 14: 08: 54.946: D/dalvikvm (3861): GC_FOR_ALLOC освобожден 1K, 5% бесплатно 3770K/3964K, приостановлено 112 мс, tot аль 112ms
12-13 14: 08: 55,145 D/dalvikvm (3861): GC_CONCURRENT освободил < 1K, 5% свободного 3785K/3964K, остановился 12ms + 27ms, всего 203ms
12-13 14: 08: 55.618: D/AndroidRuntime (3861): Завершение работы VM
12-13 14: 08: 55.618: W/dalvikvm (3861): threadid = 1: выход с отключенным исключением (группа = 0x40a70930)
12-13 14:08 : 55.715: E/AndroidRuntime (3861): FATAL EXCEPTION: main
12-13 14: 08: 55.715: E/AndroidRuntime (3861): java.lang.RuntimeException: не удается запустить активность ComponentInfo {com.demostudio.restaurants/com.demostudio.restaurants.AllRestaurants}: java.lang.IllegalArgumentException: column '_id' не существует
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2180)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.app .ActivityThread.handleLaunchActivity (ActivityThread.java:2230)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.app.ActivityThread.access $ 600 (ActivityThread.java:141)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1234)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): у android .os.Handler.dispatchMessage (Handler.java:99)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.os.Looper.loop (Looper.java:137)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.app.ActivityThread.main (ActivityThread.java:5039)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): в java.lang.reflect.Method.invokeNative (собственный метод)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at java.lang.reflect.Method.invoke (Method.java:511)
12-13 14:08:55.715: E/AndroidRuntime (3861): at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:793)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at com .android.internal.os.ZygoteInit.main (ZygoteInit.java:560)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at dalvik.system.NativeStart.main (родной метод)
12 -13 14: 08: 55.715: E/AndroidRuntime (3861): вызвано: java.lang.IllegalArgumentException: column '_id' не существует
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.database.AbstractCursor.getColumnIndexOrThrow (AbstractCursor.java:303)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.support.v4.widget.CursorAdapter.init (CursorAdapter.java:174)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.support.v4.widget.CursorAdapter. (CursorAdapter.java:151)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.support.v4.widget.ResourceCursorAdapter. (ResourceCursorAdapter.java:93)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): на android.support.v4.widget.SimpleCursorAdapter . (SimpleCursorAdapter.java:89)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at com.demostudio.restaurants.AllRestaurants.onPostExecute (AllRestaurants.java:27)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at com.demostudio.restaurants.AllRestaurants.onCreate (AllRestaurants.java:18)
12-13 14: 08: 55.715: E/AndroidRunti me (3861): at android.app.Activity.performCreate (Activity.java:5104)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java : 1080)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2144)
12-13 14: 08: 55.715: E/AndroidRuntime (3861): ... 11

Я ранее размещал listview с двумя текстовыми изображениями в том же файле XML, но это не сработало. Итак, теперь я помещаю его в отдельный XML-файл, но он все равно не работает.

+0

Возможный дубликат [Создание базы данных, созданной исходным файлом SQLiteHelper] (http://stackoverflow.com/questions/13832824/instantiate-a-database-created-by-sqlitehelper-source-file) – CommonsWare

+0

, где вы вызываете 'onPostExecute (Void arg0)' метод? –

+0

Да, но у меня нет ответов, которые могут помочь мне разрешить это. – androidnerd

ответ

2

В вашем onCreate() вашего помощника, у вас есть:

String newTableSQL = 
    "CREATE TABLE "+ 
    `+ 
    " ("+colRestaurantID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+ 
    colRestaurantName+" TEXT NOT NULL, "+ 
    colRestaurantStore+" TEXT NOT NULL "+ 
    ");"; 

Обратите внимание, как вы объединяете строки для создания полного оператора. В результате SQL будет:

CREATE TABLE RestaurantList (RestaurantID INTEGER PRIMARY KEY AUTOINCREMENT, RestaurantName TEXT NOT NULL, RestaurantStore TEXT NOT NULL); 

основаны на ваших значений restaurantListTable, colRestaurantID, colRestaurantName, colRestaurantStore.

Однако в вашем rawQuery() вызова, ваш SQL заключается в следующем:

SELECT colRestaurantID AS _id, colRestaurantName, colRestaurantStore FROM RestaurantListTable ORDER BY colRestaurantName 

Обратите внимание, что имена столбцов в rawQuery() SQL имеют col перед ними, что вы не будете иметь в своем CREATE TABLE.Это не сработает, так как вам нужно, чтобы имена столбцов были согласованными.

Внесите ли вы свое заявление CREATE TABLE или ваше заявление SELECT зависит от вас.

+0

Спасибо. Это работает. Однако у меня есть db.close(); в моем onCreate для базы данных. Как открыть базу данных в моей деятельности? По-видимому, getReadableDatabase не может открыть базу данных. Я не могу поставить db.open() ни один. – androidnerd

+0

@JYLim: «Очевидно, getReadableDatabase не может открыть базу данных» - 'getReadableDatabase()' - это то, как вы открываете базу данных для операций чтения. Используйте 'getWritableDatabase()', если вам нужно дополнительно выполнить операции записи. – CommonsWare

0

Вы сделали это снова. Если вам нужна БД Инстанцирование поле, изменить RestaurantDB db=new RestaurantDB(AllRestaurants.this); к db=new RestaurantDB(AllRestaurants.this);

+0

На самом деле я изменил его в своем последнем исходном файле, но он не работает. – androidnerd

0
private Cursor doQuery() { 
return(db.getReadableDatabase().rawQuery("SELECT colRestaurantID AS _id, colRestaurantName, colRestaurantStore " 
+ "FROM RestaurantListTable ORDER BY colRestaurantName", null)); 
} 

следует использовать ниже вместо этого:

private Cursor doQuery() { 
return(db.getReadableDatabase().rawQuery("SELECT RestaurantID AS _id, RestaurantName, StoreNo " 
+ "FROM RestaurantList ORDER BY RestaurantName", null)); 
} 
Смежные вопросы