SQlite查询问题,导致强制关闭
我正在编写我的第一个应用程序,并且我也试图合并一个数据库,并且我非常努力。我试图做的是有多个spinners,那些spinners从数据库中获取他们的数据。每个微调器都会执行不同的查询。SQlite查询问题,导致强制关闭
到目前为止,这是我:DBUtility
import android.content.Context;
进口android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.widget.SimpleCursorAdapter;
公共类DbUtility {
static final String DB_NAME="food";
static final String BEEF_TABLE="beef";
static final String CHICKEN_TABLE="chicken";
SQLiteDatabase db=null;
Context context;
public static class DatabaseHelper extends SQLiteOpenHelper
{
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
{
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL("CREATE TABLE IF NOT EXISTS "+BEEF_TABLE+" (_id INT PRIMARY KEY, cookTime INT PRIMARY KEY ,name VARCHAR);");
db.execSQL("INSERT INTO "+BEEF_TABLE+" values(5000,'Skirt Steak');");
db.execSQL("INSERT INTO "+BEEF_TABLE+" values(10000,'Flank Steak');");
db.execSQL("INSERT INTO "+BEEF_TABLE+" values(15000,'Filet Mignon');");
db.execSQL("CREATE TABLE IF NOT EXISTS "+CHICKEN_TABLE+" (_id INT PRIMARY KEY, cookTime INT PRIMARY KEY ,name VARCHAR);");
db.execSQL("INSERT INTO "+CHICKEN_TABLE+" values(5000,'Breast');");
db.execSQL("INSERT INTO "+CHICKEN_TABLE+" values(10000,'Wings');");
db.execSQL("INSERT INTO "+CHICKEN_TABLE+" values(15000,'Burger');");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public DbUtility(Context context) {
this.context=context;
}
public SimpleCursorAdapter getBeefAdapter()
{
DatabaseHelper dbhelper=new DatabaseHelper(this.context, DB_NAME, null, 1);
db=dbhelper.getWritableDatabase();
Cursor beefCursor=db.rawQuery("SELECT * FROM "+BEEF_TABLE, null);
while(!beefCursor.isLast())
beefCursor.moveToNext(); //I don't understand why but it's necessary (alternative call c.getCount())
String[] from=new String[1];
from[0]="name";
int[] to=new int[1];
to[0]=android.R.id.text1;
SimpleCursorAdapter beefAdapter=new SimpleCursorAdapter(this.context, android.R.layout.simple_spinner_item, beefCursor, from, to);
beefAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
db.close();
return beefAdapter;
}
public SimpleCursorAdapter getChickenAdapter()
{
DatabaseHelper dbhelper=new DatabaseHelper(this.context, DB_NAME, null, 1);
db=dbhelper.getWritableDatabase();
Cursor chickenCursor=db.rawQuery("SELECT * FROM "+CHICKEN_TABLE, null);//If I change this to BEEF_TABLE it doesn't force close...
while(!chickenCursor.isLast())
chickenCursor.moveToNext(); //I don't understand why but it's necessary (alternative call c.getCount())
String[] from=new String[1];
from[0]="name";
int[] to=new int[1];
to[0]=android.R.id.text1;
SimpleCursorAdapter chickenAdapter=new SimpleCursorAdapter(this.context, android.R.layout.simple_spinner_item, chickenCursor, from, to);
chickenAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
db.close();
return chickenAdapter;
}
}
,我也有我的chickenActivity,这是我的微调器:
包com.tsilo.grillbuddy;
import android.app.Activity; import android.os.Bundle; import android.widget.SimpleCursorAdapter; import android.widget.Spinner;
公共类ChickenActivity extends Activity活动第一次创建时调用。 */ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.spinner);
DbUtility db=new DbUtility(this);
SimpleCursorAdapter beefAdapter=db.getBeefAdapter();
Spinner beefSpinner=(Spinner)this.findViewById(R.id.spinner);
beefSpinner.setAdapter(beefAdapter);
SimpleCursorAdapter chickenAdapter=db.getChickenAdapter();
Spinner chickenSpinner=(Spinner)this.findViewById(R.id.spinner2);
chickenSpinner.setAdapter(chickenAdapter);
}
}
这是我已经注意到:
如果我改变我的getChickenAdapter(),所以它查询BEEF_TABLE,它的工作原理,只有当我切换到CHICKEN_TABLE,它强制关闭。
我DDMS错误:
12-06 16:03:12.473:INFO /数据库(11856):源码返回:错误代码= 1,味精=没有这样的表:鸡 12-06 16:03:12.473:DEBUG/AndroidRuntime(11856):关闭虚拟机 12-06 16:03:12.473:WARN/dalvikvm(11856):threadid = 1:线程以未捕获的异常退出(group = 0x4001d7f0) 12- 06 16:03:12.483:错误/ AndroidRuntime(11856):致命例外:主 12-06 16:03:12.483:错误/ AndroidRuntime(11856):java.lang.RuntimeException:无法启动活动ComponentInfo {com.tsilo .grillbuddy/com.tsilo.grillbuddy.ChickenAct ivity}:android.database.sqlite.SQLiteException:没有这样的表:鸡:,编译时:SELECT * FROM chicken
我想知道DatabaseHelper.onCreate()
是否在运行应用程序时被调用。如果你不确定,那就在那里设置一个断点,然后看看。如果它没有被调用,那么你的数据库的一个旧版本正在使用,也许该版本没有“鸡”表。尝试卸载应用程序并再次运行它(它会自动安装。)
如果事实证明是这个问题,您可能希望将未来的任何CREATE TABLE IF NOT EXISTS调用移入将从onCreate
和onUpgrade
中调用的常用方法,并确保将您的DB版本号正如你这样做。
您在DDMS中遇到的错误是什么? – kthorat 2010-12-06 20:39:22
为什么BEEF_TABLE有两个`PRIMARY KEY`? – Pentium10 2010-12-06 20:41:28