我已经创建了一个SQLite数据库,我想在Spinner中插入一个列数据。我在下面编写了这段代码,但它不起作用..问题是什么?
以下是代码:
public class RemoveWorkflow2 extends Activity {
private EditText nameEditText;
private EditText classEditText;
//private EditText idEditText;
//private int mSpinnerWF;
Spinner spin;
WorkflowChoice wf = new WorkflowChoice();
MyDatabase mDB;
//MyDatabase mDB = wf.getDb();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.remove_wf2);
mDB = new MyDatabase(getApplicationContext());
spin = (Spinner)findViewById(R.id.wf_spinner);
fillSpinner(spin);
Button btn = (Button)findViewById(R.id.button11);
btn.setText("Rimuovi");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
/*
Spinner spin = (Spinner)findViewById(R.id.wf_spinner);
Cursor cur = mDB.fetchWfs();
startManagingCursor(cur);
String[] from = new String[] { WfMetaData.WF_NAME_KEY };
int[] to = new int[] { android.R.id.text1 };
SimpleCursorAdapter spinAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cur, from, to);
spinAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spin.setAdapter(spinAdapter);
spin.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
Cursor c = (Cursor)parent.getItemAtPosition(pos);
mSpinnerWF = c.getInt(c.getColumnIndexOrThrow(WfMetaData.WF_NAME_KEY));
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});*/
}
private void fillSpinner(Spinner s){
Cursor c = mDB.fetchWfs();
startManagingCursor(c);
// create an array to specify which fields we want to display
String[] from = new String[]{WfMetaData.WF_NAME_KEY};
// create an array of the display item we want to bind our data to
int[] to = new int[]{android.R.id.text1};
// create simple cursor adapter
SimpleCursorAdapter adapter =
new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, c, from, to );
adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
// get reference to our spinner
s.setAdapter(adapter);
}
这是另一个MyDatabase:
public class MyDatabase {
SQLiteDatabase mDb;
DbHelper mDbHelper;
Context mContext;
private static final String DEBUG_TAG = "WFListDatabase";
private static final String DB_NAME="WFListdb";//nome del db
private static final int DB_VERSION=1; //numero di versione del nostro db
public MyDatabase(Context ctx){
mContext = ctx;
mDbHelper = new DbHelper(ctx, DB_NAME, null, DB_VERSION); //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)
}
public void open(){ //il database su cui agiamo è leggibile/scrivibile
mDb=mDbHelper.getWritableDatabase();
}
public void close(){ //chiudiamo il database su cui agiamo
mDb.close();
}
public void insertWf(String name,String cls){ //metodo per inserire i dati
ContentValues cv=new ContentValues();
cv.put(WfMetaData.WF_NAME_KEY, name);
cv.put(WfMetaData.WF_CLASS_KEY, cls);
mDb.insert(WfMetaData.WF_TABLE, null, cv);
}
public Cursor fetchAllWfs(){ //metodo per fare la query di tutti i dati
return mDb.query(WfMetaData.WF_TABLE, new String[]{WfMetaData.WF_NAME_KEY, WfMetaData.WF_CLASS_KEY},null,null,null,null,null);
}
static class WfMetaData { // i metadati della tabella, accessibili ovunque
static final String WF_TABLE = "wfs";
static final String ID = "_id";
static final String WF_NAME_KEY = "name";
static final String WF_CLASS_KEY = "class";
}
private static final String WF_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " //codice sql di creazione della tabella
+ WfMetaData.WF_TABLE + " ("
+ WfMetaData.ID+ " integer primary key autoincrement, "
+ WfMetaData.WF_NAME_KEY + " text not null, "
+ WfMetaData.WF_CLASS_KEY + " text not null);";
public Cursor fetchWfs(){ //metodo per fare la query di tutti i dati
return mDb.query(WfMetaData.WF_TABLE, null,null,null,null,null,null);
}
public void delete_byName(String n){
mDb.delete(WfMetaData.WF_TABLE, WfMetaData.WF_NAME_KEY + "='" +n + "'", null);
//mDb.delete(WfMetaData.WF_TABLE, WfMetaData.WF_NAME_KEY + "=?", new String[] { n });
CharSequence text = "Il Workflow "+ n +" è stato rimosso con successo!";
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(mContext, text, duration);
toast.show();
}
private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db
public DbHelper(Context context, String name, CursorFactory factory,int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
_db.execSQL(WF_TABLE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
Log.w(DEBUG_TAG, "Upgrading database. Existing contents will be lost. ["
+ oldVersion + "]->[" + newVersion + "]");
_db.execSQL("DROP TABLE IF EXISTS " + WF_TABLE_CREATE);
onCreate(_db);
}
}
public boolean isEmpty(){
boolean isEmpty = true;
Cursor cursor = mDb.query(WfMetaData.WF_TABLE, new String[] { WfMetaData.WF_NAME_KEY }, null, null, null, null, null);
if (cursor != null && cursor.getCount() > 0)
{
isEmpty = false;
}
return isEmpty;
}
}
这里是xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Scegli il workflow da eliminare: "
android:gravity="center" />
<Spinner
android:id="@+id/wf_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Button" />
</LinearLayout>
带有NullPointerException的LoGcat ..
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1696)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1721)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.app.ActivityThread.access$1500(ActivityThread.java:124)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:968)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.os.Handler.dispatchMessage(Handler.java:99)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.os.Looper.loop(Looper.java:130)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.app.ActivityThread.main(ActivityThread.java:3844)
05-10 11:48:04.475: E/AndroidRuntime(24650): at java.lang.reflect.Method.invokeNative(Native Method)
05-10 11:48:04.475: E/AndroidRuntime(24650): at java.lang.reflect.Method.invoke(Method.java:507)
05-10 11:48:04.475: E/AndroidRuntime(24650): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-10 11:48:04.475: E/AndroidRuntime(24650): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-10 11:48:04.475: E/AndroidRuntime(24650): at dalvik.system.NativeStart.main(Native Method)
05-10 11:48:04.475: E/AndroidRuntime(24650): Caused by: java.lang.NullPointerException
05-10 11:48:04.475: E/AndroidRuntime(24650): at com.tilab.wade.interactivity.android.client.RemoveWorkflow2.fillSpinner(RemoveWorkflow2.java:82)
05-10 11:48:04.475: E/AndroidRuntime(24650): at com.tilab.wade.interactivity.android.client.RemoveWorkflow2.onCreate(RemoveWorkflow2.java:44)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-10 11:48:04.475: E/AndroidRuntime(24650): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1660)
05-10 11:48:04.475: E/AndroidRuntime(24650): ... 11 more
05-10 11:48:04.485: W/ActivityManager(1610): Force finishing activity com.tilab.wade.interactivity.android.client/.RemoveWorkflow2
答案 0 :(得分:0)
MyDatabase mDB = new MyDatabase(getApplicationContext());
实例化一个隐藏全局变量的局部变量,因此全局mDB为空。
mDB = new MyDatabase(getApplicationContext());
答案 1 :(得分:0)
您正在onCreate中初始化局部变量mDb,并且可能在fillSpinner中使用全局变量。纠正这个并检查它是否有效
答案 2 :(得分:-1)
好像你没有打开数据库。