2010-12-06 8 views
0

の原因となります。私がしようとしているのは、複数のスピナーを持ち、それらのスピナーがデータベースからデータを取得することです。各スピンナーは異なるクエリを実行します。SQLiteのクエリの問題、私は私の最初のアプリケーションを書いています、と私はまた、データベースを組み込むしようとしている、と私は本当にそれで苦労していフォース閉じる

これまでのところ、これは私が持っているものです。DBUtility

import android.content.Context; 

輸入android.database.Cursor。 インポートandroid.database.sqlite.SQLiteDatabase。 インポートandroid.database.sqlite.SQLiteOpenHelper。 インポート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。 import android.os.Bundle; インポートandroid.widget.SimpleCursorAdapter。 import android.widget.Spinner;

public class ChickenActivity extends Activity { /**アクティビティが初めて作成されたときに呼び出されます。 */ @Override パブリックボイド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を(変更した場合)ので、それはそれはそれは閉じを強制することを、私はCHICKEN_TABLEに切り替えたときのみである、それが動作、BEEF_TABLEを問い合わせます。


マイDDMSエラー:

12月6日16:03:12.473:INFO /データベース(11856):sqliteのが返されました:エラーコード= 1、MSG =なし、このようなテーブル:鶏 12-06を16:03:12.473:DEBUG/AndroidRuntime(11856):VMをシャットダウンする 12-06 16:03:12.473:WARN/dalvikvm(11856):threadid = 1:未知の例外(グループ= 0x4001d7f0)でスレッドが終了する 12- 16:03:12.483:ERROR/AndroidRuntime(11856):致命的な例外:メイン 12-06 16:03:12.483:ERROR/AndroidRuntime(11856):java.lang.RuntimeException:アクティビティを開始できませんでした。ComponentInfo {com.tsilo .grillbuddy/com.tsilo.grillbuddy.ChickenActコンパイル時に:* *チキンから*

+1

DDMSでエラーが発生しましたか? – kthorat

+0

なぜBEEF_TABLEに2つの 'PRIMARY KEY'がありますか? – Pentium10

答えて

1

私はアプリを実行するときにDatabaseHelper.onCreate()が呼び出されているのだろうかと思っています。あなたが不明な場合は、そこにブレークポイントを設定し、参照してください。呼び出されていない場合、古いバージョンのデータベースが使用されており、おそらくそのバージョンには「チキン」テーブルがありません。アプリをアンインストールしてもう一度実行してみてください(自動的にインストールされます)。)

onCreateonUpgradeの両方から呼び出される共通のメソッドに将来のCREATE TABLE IF NOT EXISTS呼び出しを移動し、DBのバージョン番号を必ず増やしたい場合がありますあなたがそうするように。

+0

はい!それは、私はアンインストールして再インストールした、私はそれが働いて追加したときに、私は列に主キーを追加することを忘れていた!本当にありがとう、私はそれを理解できませんでした – SickNick

関連する問題