2011-06-19 64 views
0

嘿,我最近開始android開發,並遇到了一個問題時,從數據庫中保存/加載數據。我從here拿到了數據庫類,稍作修改。android sqlite問題

我的問題是我得到了一些edittexts的活動。在onCreate時,應該將數據庫中的字符串寫入edittext中,當按下按鈕時,數據庫中的數據應該更新並關閉活動。對於數據庫爲空的情況,我添加了一個用於讀取數據庫的cursor.getCount!= 0的if子句,但是這種情況永遠不會成立。

這裏是我的代碼

package com.gabrielisonline.timetable; 

public class DurationActivity extends Activity { 

DbAdapter dba; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.duration); 

    Button saveButton = (Button) findViewById(R.id.duration_button1); 
    saveButton.setOnClickListener(new SaveButtonListener()); 

    dba = new DbAdapter(this); 
    dba.open(); 
    Cursor c = dba.fetchAllDurations(); 

    if (c.getCount() != 0) { 
     int i = c.getColumnIndex(DbAdapter.KEY_TIME); 

     ((EditText) findViewById(R.id.duration_length)).setText(dba.fetchDuration(0).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson1)).setText(dba.fetchDuration(1).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson2)).setText(dba.fetchDuration(2).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson3)).setText(dba.fetchDuration(3).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson4)).setText(dba.fetchDuration(4).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson5)).setText(dba.fetchDuration(5).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson6)).setText(dba.fetchDuration(6).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson7)).setText(dba.fetchDuration(7).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson8)).setText(dba.fetchDuration(8).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson9)).setText(dba.fetchDuration(9).getString(i)); 
     ((EditText) findViewById(R.id.duration_lesson10)).setText(dba.fetchDuration(10).getString(i)); 
    } 


} 

public class SaveButtonListener implements OnClickListener { 
    @Override 
    public void onClick(View v) { 

     String l = ((EditText) findViewById(R.id.duration_length)).getText().toString(); 
     String l1 = ((EditText) findViewById(R.id.duration_lesson1)).getText().toString(); 
     String l2 = ((EditText) findViewById(R.id.duration_lesson2)).getText().toString(); 
     String l3 = ((EditText) findViewById(R.id.duration_lesson3)).getText().toString(); 
     String l4 = ((EditText) findViewById(R.id.duration_lesson4)).getText().toString(); 
     String l5 = ((EditText) findViewById(R.id.duration_lesson5)).getText().toString(); 
     String l6 = ((EditText) findViewById(R.id.duration_lesson6)).getText().toString(); 
     String l7 = ((EditText) findViewById(R.id.duration_lesson7)).getText().toString(); 
     String l8 = ((EditText) findViewById(R.id.duration_lesson8)).getText().toString(); 
     String l9 = ((EditText) findViewById(R.id.duration_lesson9)).getText().toString(); 
     String l10 = ((EditText) findViewById(R.id.duration_lesson10)).getText().toString(); 

     dba.updateDuration(0,l); 
     dba.updateDuration(1,l1); 
     dba.updateDuration(2,l2); 
     dba.updateDuration(3,l3); 
     dba.updateDuration(4,l4); 
     dba.updateDuration(5,l5); 
     dba.updateDuration(6,l6); 
     dba.updateDuration(7,l7); 
     dba.updateDuration(8,l8); 
     dba.updateDuration(9,l9); 
     dba.updateDuration(10,l10);    

     dba.close(); 

     finish(); 
    } 
} 
} 

感謝您的幫助!

編輯:

感謝您的答案傢伙。問題的確在於我沒有真正寫入數據庫。而不是僅僅使用updateDuration,我將onClick方法中的代碼更改爲:

if (c.getCount() != 0) {   
dba.updateDuration(1,l); 
dba.updateDuration(2,l1); 
dba.updateDuration(3,l2); 
dba.updateDuration(4,l3); 
dba.updateDuration(5,l4); 
dba.updateDuration(6,l5); 
dba.updateDuration(7,l6); 
dba.updateDuration(8,l7); 
dba.updateDuration(9,l8); 
dba.updateDuration(10,l9); 
dba.updateDuration(11,l10); 
} else { 
dba.createDuration(l); 
dba.createDuration(l1); 
dba.createDuration(l2); 
dba.createDuration(l3); 
dba.createDuration(l4); 
dba.createDuration(l5); 
dba.createDuration(l6); 
dba.createDuration(l7); 
dba.createDuration(l8); 
dba.createDuration(l9); 
dba.createDuration(l10); 
} 

現在一切正常。我認爲更新方法也足夠用於第一次寫入數據庫(createDuration在DbAdapter和updateDuration調用update中調用數據庫上的create方法)。

+0

請發佈有關該錯誤的更多詳細信息。你得到什麼錯誤/異常?代碼中的哪一行會發生錯誤?你在哪裏寫數據到數據庫? –

+0

沒有例外。問題是數據庫從不讀取。例如,當我打開活動時,在edittext中寫入內容,按保存然後重新打開活動,onCreate應該將剛保存的字符串寫回edittext,但edittext是空的。我用dba.updateDuration寫入數據。如果你想我可以發佈數據庫代碼,但是正如所說的,它大部分與上面的鏈接相同,只是我少了一列並更改了一些名稱。 – androidfan

回答

0

你有沒有寫過什麼數據庫?你知道數據庫肯定有數據嗎?如果不嘗試安裝SQLLite瀏覽器(如http://sqlitebrowser.sourceforge.net/)並查看錶格。

這應該有助於識別問題是寫入表格還是讀取問題。如果您提供DBAdapter類,可能會進一步提供幫助

0

如果您的遊標未獲取任何值,則可能意味着數據庫沒有任何值。另外一個錯誤我在你的代碼注意到的是,你得到的數據庫值到光標之後,你必須調用

c.moveToFirst(); 

將光標指針移動到第一條記錄。如果您不移動指針,則默認指向位置-1。只有在這之後你才能調用c.getString(1)來獲取值。