2011-12-07 72 views
0

尝试为Android应用程序使用多表SQL适配器时出现错误。我已经搜索了该网站和互联网,并且还没有找到解决方案。尝试使用多个表时出现SQLite数据库错误

这里是logcat的堆栈,我得到的,当我得到的错误:

12-07 00:02:56.696: E/AndroidRuntime(31297): FATAL EXCEPTION: main 
    12-07 00:02:56.696: E/AndroidRuntime(31297): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tma.android.recipebox/com.tma.android.recipebox.MealHomeActivity}: java.lang.IllegalArgumentException: column '_id' does not exist 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.ActivityThread.access$500(ActivityThread.java:122) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.os.Handler.dispatchMessage(Handler.java:99) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.os.Looper.loop(Looper.java:132) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.ActivityThread.main(ActivityThread.java:4123) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at java.lang.reflect.Method.invokeNative(Native Method) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at java.lang.reflect.Method.invoke(Method.java:491) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at dalvik.system.NativeStart.main(Native Method) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:299) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.widget.CursorAdapter.init(CursorAdapter.java:169) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.widget.CursorAdapter.<init>(CursorAdapter.java:117) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at com.tma.android.recipebox.MealHomeActivity.fillData(MealHomeActivity.java:38) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at com.tma.android.recipebox.MealHomeActivity.onCreate(MealHomeActivity.java:28) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.Activity.performCreate(Activity.java:4397) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779) 
    12-07 00:02:56.696: E/AndroidRuntime(31297): ... 11 more 

的logcat中似乎并没有给我在活动指定的线数,导致该错误,所以我会后整个事情,我想:

package com.tma.android.recipebox; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.View; 
import android.widget.Button; 
import android.widget.SimpleCursorAdapter; 

public class MealHomeActivity extends ListActivity { 

private Button mAddButton; 
private MyDbAdapter mDbHelper; 

private static final int ACTIVITY_EDIT = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.meal_home); 
    mDbHelper = new MyDbAdapter(this); 
    mDbHelper.open(); 

    setButtonClickListeners(); 
    fillData(); 
} 

private void fillData() { 
    Cursor mealCursor = mDbHelper.fetchAllMeals(); 
    startManagingCursor(mealCursor); 

    String[] from = new String[]{MyDbAdapter.KEY_TITLE, MyDbAdapter.KEY_MEALDATE}; 
    int[] to = new int[]{R.id.text1, R.id.text2}; 

    SimpleCursorAdapter meals = new SimpleCursorAdapter(this, R.layout.meal_row, mealCursor, from, to); 
    setListAdapter(meals); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    MenuInflater mi = getMenuInflater(); 
    mi.inflate(R.menu.meal_list_menu, menu); 
    return true; 
} 

private void createMeal() { 
    Intent i = new Intent(this, MealEditActivity.class); 
    startActivityForResult(i, ACTIVITY_EDIT); 
} 

private void setButtonClickListeners() { 
    mAddButton = (Button) findViewById(R.id.add_button); 
    mAddButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      createMeal(); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    fillData(); 
} 

} 

我也将张贴创建语句中我将对DBAdapter:

package com.tma.android.recipebox; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class MyDbAdapter { 

private static final String TAG = "MyDbAdapter"; 
private static final String DATABASE_NAME = "recipe_box"; 
private static final int DATABASE_VERSION = 4; 

private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb; 

/** 
* Recipe Table Constants 
*/ 

private static final String DATABASE_TABLE = "recipes"; 
public static final String KEY_NAME = "name"; 
public static final String KEY_ING = "ingredients"; 
public static final String KEY_PREP = "preparation"; 
public static final String KEY_DATE = "date"; 
public static final String KEY_ROWID = "_id"; 

/** 
* Meal table constants 
*/ 

private static final String DATABASE2_TABLE = "meals"; 
public static final String KEY_TITLE = "title"; 
public static final String KEY_RECIPES = "recipes"; 
public static final String KEY_MEALDATE = "date"; 
public static final String KEY_MEALID = "mealId"; 

/** 
* creation statement for the Recipe table 
*/ 

private static final String CREATE_RECIPE_TABLE = "create table " + DATABASE_TABLE + "(_id integer primary key autoincrement," 
    + KEY_NAME + " text not null, " + KEY_ING + " text not null, " + KEY_PREP + 
    " text not null, " + KEY_DATE + " text not null);"; 

/** 
* creation statement for the Meal table 
*/ 

private static final String CREATE_MEAL_TABLE = "create table " + DATABASE2_TABLE + "(" + KEY_MEALID 
    + " integer primary key autoincrement," + KEY_TITLE + " text not null, " + KEY_RECIPES + " text not null, " + 
    KEY_MEALDATE + " text not null);"; 

请让我知道,如果我需要发布任何可能帮助你回答我的问题的东西。

+1

检查你CREATE_RECIPE_TABLE表是否有“_id”列? – user370305

+0

检查此:[列_id不存在](http://stackoverflow.com/questions/3360605/column-id-does-not-exist)和此[Android:列_id'不存在的问题](http ://stackoverflow.com/questions/5825020/android-column-id-does-not-exist-problem) –

回答

2

CursorAdapters需要有一个光标,其中有_id列。如果你的数据库中没有_id列,只需选择你的主键(在你的情况下,我猜它的用餐ID),mealId as _id。你应该很好走。

+0

我在哪里使用'mealId作为_id'?如果我只是将'mealId'改为'_id',那会解决我的问题吗? – jasonh90

+0

是的,只要你能做到。在许多情况下,我们无法挑战主键,在这种情况下,您可以使用“as”查询。 –

+0

我在哪里使用'mealId作为_id'?在创建声明中? – jasonh90

相关问题