2014-07-13 110 views
0

我想從我創建的數據庫中使用類擴展到Sqliteopenhelper類,並將其放到列表視圖中的數據,但我從數據庫使用fetch()函數時出現錯誤在我的活動課上課。請幫我解釋爲什麼在「cursor = demo1.fetch();」中出現錯誤只有線.....但是當我包括行demo1.adddata()這是用來在數據庫中添加數據線,所述應用程序運行而不給予任何錯誤....無法從自己創建的SQLite數據庫中獲取數據android

mainactivity.java

public class mainactivity extends Activity{ 
    Listview list; 
    Cursor cursor; 
    database demo1; 
    String[] str; 
    int count; 
    adapterdemo adapter; 


    protected void onCreate(Bundle savedInstance){ 
    super.onCreate(savedInstance); 
    setContentView(R.layout.list); 


    demo1 = new database(getApplicationContext()); 

    //demo1.adddata(); 

    cursor = demo1.fetch(); 



    count = cursor.getCount(); 
    str = new String[count]; 

    cursor.moveToFirst(); 
    for(int i=0;i<count;i++) 
    { 
     str[i] = cursor.getString(0); 
     Toast.makeText(getApplicationContext(), str[i], 3000).show(); 
     cursor.moveToNext(); 
    } 
    adapter= new adapterdemo(this, str); 
    list.setAdapter(adapter); 

}}

database.java

public class database extends SQLiteOpenHelper { 
SQLiteDatabase sql; 

public database(Context context) { 
    super(context, "Template", null, 1); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase arg0) { 
    // TODO Auto-generated method stub 
    String query = "Create table smstemp(sms_Template Text)"; 
    arg0.execSQL(query); 

} 

@Override 
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 
    // TODO Auto-generated method stub 

} 

public void adddata() { 
    // TODO Auto-generated method stub 
    sql = this.getReadableDatabase(); 

    ContentValues cv = new ContentValues(); 
    cv.put("sms_Template", "wait...."); 


    sql.insert("smstemp", null, cv); 



} 



public Cursor fetch() { 
    // TODO Auto-generated method stub 
    Cursor c = sql.query("smstemp", new String[]{"sms_Template"}, null,null, null, null, null); 
    return c; 
} 

}

+0

你能提供錯誤日誌嗎? – prabhat

+0

可能在光標處獲得NPE c = sql.query(..) – prabhat

+0

sql = this.getReadableDatabase();將此ling移動到onCreate()。 – prabhat

回答

1

您的變量sql未初始化,因此您將獲得NPE。

爲什麼添加adddata()「解決」問題是因爲該方法初始化變量。

最好不要將SQLiteDatabase作爲成員變量。相反,初始化一個局部變量fetch(),就像

SQLiteDatabase sql = getWritableDatabase(); 
+0

與我的基本答案相同,但您的解釋更好;)Upvote。 –

+0

謝謝@laalto這個東西幫助... :) – shalini

1

PRABHAT是右擊噸。我只是寫了一個關於最佳實踐的大文檔。不必要的現場狀態不好。您不需要:

SQLiteDatabase sql;

只需在兩種方法中調用getReadableDatabase()。

這裏是一個典型的例子,說明爲什麼本地字段可能會變得很糟糕。

如果它是一個性能的話,額外的方法調用就像實際磁盤訪問的1/10000000000。