2013-07-19 3 views
-2

두 개의 단추와 텍스트보기로 구성된 응용 프로그램이 있습니다.Select 문이 제대로 작동하지 않습니다.

  • btnInsert는 : 사용자가이를 클릭하면, 삽입 명령문

  • btnShow

    수행 될 것이다 : SELECT 문이 실행되며, 그 결과이 텍스트 뷰에 표시된다.

문제는 다음과 같습니다. AsyncTask를 사용하여 쓰기/읽기 작업을 수행하고 있습니다. 저는 두 개의 분리 된 AsyncTask를 작성했습니다. 하나는 읽기 용이고 하나는 쓰기 용입니다. 인서트 (비동기가 제대로 작동 쓰기, 그리고 내가 두 번 같은 삽입 문을 실행하기 때문에 경우 값이 나는 기본 키 위반 오류가 삽입지고 있음을 확신 :.

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) 

문제가 발생하는 곳은 모두 (선택 버튼을 클릭하여) Select Statement를 실행하면 값이 적절하게 수행됩니다. [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을 사용 해본 적이 있습니까? 이런 종류의 DB 액세스는 나에게 매우 불안정한 것처럼 보입니다. –

+0

나는 그것을 언젠가 시험해보아야한다, 제안에 감사드립니다! – ClaireG

답변

0

:

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

변수 n이 tyoe AsyncTask이며, 그 위에 toString()을 적용하는 것은 그러므로 당신이 설명처럼 클래스의 이름 만 제공 ([email protected]).

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

을하고 온 클릭 핸들러에서 라인 txtView.setText(n.toString());을 제거 :

당신은 무엇을 할 수있어 것은

이에 Select 클래스의 onPostExecute() 방법을 변경합니다.

+0

괜찮 았어! 너무 많이 고마워요! – ClaireG

관련 문제