Я пишу свое первое приложение, и я также пытаюсь включить базу данных, и я действительно борюсь с ней. То, что я пытаюсь сделать, - это иметь несколько счетчиков, и эти счетчики получают свои данные из базы данных. Каждый счетчик выполнит свой запрос.
Пока это то, что у меня есть: DBUtility
import android.content.Context;
import 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;
импорт android.app.Activity;
импорт android.os.Bundle;
import android.widget.SimpleCursorAdapter;
импорт android.widget.Spinner;
открытый класс ChickenActivity расширяет Activity {
/ ** Вызывается при первом создании действия. * /
@Override
public void onCreate (BundlevedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.spinner); * +1019 *
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): sqlite вернул: код ошибки = 1, msg = нет такой таблицы: курица
12-06 16: 03: 12.473: DEBUG / AndroidRuntime (11856): выключение виртуальной машины
12-06 16: 03: 12.473: WARN / dalvikvm (11856): threadid = 1: поток выходит с необработанным исключением (группа = 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.ChickenActivity}: android.database.sqlite.SQLiteException : такой таблицы нет: chicken: при компиляции: SELECT * FROM chicken