2013-07-19 181 views
-2

我有一個包含兩個按鈕和一個文本視圖的應用程序。Select Statement not working properly

  • btnInsert:用戶點擊這個時,一個插入語句將被執行

  • btnShow:選擇語句將被執行,並且結果被顯示在TextView的。

問題是以下內容。我使用AsyncTask來執行寫/讀操作。我創建了兩個獨立的AsyncTasks,一個用於閱讀,一個用於寫作。插入(寫異步正常工作,而且我相信,越來越插入值,因爲如果我運行相同的INSERT語句兩次我得到一個主鍵衝突錯誤:

07-19 11:46:48.080: E/AndroidRuntime(21486): FATAL EXCEPTION: main 
07-19 11:46:48.080: E/AndroidRuntime(21486): android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique (code 19) 

這就是問題產生的一切顯然,當我運行選擇語句(通過單擊按鈕),然而,而不是價值,我得到[email protected]

有人知道什麼問題是?這是非常煩人的,我不知道我做錯了什麼,請看看我的代碼:

public class MainActivity extends Activity 
{ 
static DatabaseImplementation db; 
static SQLiteDatabase dbWrite; 
static SQLiteDatabase dbRead; 

static String insert = "INSERT INTO tbl_Test VALUES(7, 'Test');"; 
static String select = "SELECT test FROM tbl_Test WHERE _id = 1;"; 

Button btnInsert; 
Button btnShow; 
static TextView txtView; 

//static String name = ""; 


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

    db = new DatabaseImplementation(this); 
    dbWrite = db.getWritableDatabase(); 
    dbRead = db.getReadableDatabase(); 

    txtView = (TextView)findViewById(R.id.txtView); 

    btnInsert = (Button)findViewById(R.id.btnInsert); 
    btnInsert.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      new Insert().execute(); 
     } 
    }); 

    btnShow = (Button)findViewById(R.id.btnShow); 
    btnShow.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) 
     { 
      AsyncTask<String, Void, String> n = new Select().execute(); 
      txtView.setText(n.toString()); 
     } 
    }); 


} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

//INSERT ASYNC 
private class Insert extends AsyncTask<String, Void, String> 
{  
    @Override 
    protected String doInBackground(String... params) 
    { 

     //Connect to Database First. 
     try 
     {  
      //String insert = executeInsert(); 
      //onPostExecute(insert); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 

     //Connect to Database First. 
     dbWrite.execSQL(insert); 
    } 


} 

//SELECT ASYNC 
private class Select extends AsyncTask<String, Void, String> 
{ 
    @Override 
    protected String doInBackground(String... params) 
    { 
     try 
     { 
      dbWrite = db.getWritableDatabase(); 
      Cursor c = dbWrite.rawQuery(select, null); 

      String name = ""; 
      c.moveToFirst(); 
      name = c.getString(0); 

      return name; 

     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 

    } 
} 

}

我真的很感激,如果有人能幫助我。

+0

您是否考慮過使用ORM?這種數據庫訪問對我來說似乎非常不穩定。 –

+0

我應該嘗試一下,謝謝你的建議! – ClaireG

回答

0

這已無關的數據庫,但只是這樣兩條線:

AsyncTask<String, Void, String> n = new Select().execute(); 
txtView.setText(n.toString()); 

可變n是tyoe AsyncTask的,因此它適用toString()給你剛纔類的像你描述的名稱([email protected])。

你所要做的就是,改變你的Select類的onPostExecute()方法是:

@Override 
protected void onPostExecute(String result) 
{ 
    txtView.setText(result); 
} 

,並從您的onClick處理程序刪除行txtView.setText(n.toString());

+0

這工作得很好!非常感謝你! – ClaireG