-2

我有一个由两个按钮和一个文本视图组成的应用程序。

  • btnInsert: 当用户点击这个时,会执行一个插入语句

  • btnShow: 将执行一条 select 语句,并将结果显示在 TextView 中。

问题如下。我正在使用 AsyncTask 执行写/读操作。我创建了两个单独的 AsyncTask,一个用于阅读,一个用于写作。insert (Write Async 工作正常,我确信这些值正在被插入,因为如果我两次运行相同的 insert 语句,我会收到 PRIMARY KEY 违规错误:

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 语句(通过单击按钮)时,一切都正确执行,但是我得到的不是值,而是com.example.testdb.MainActivity$Select@4203e900.

有谁知道问题是什么?这很烦人,我不知道我做错了什么。请看一下我的代码:

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) 
    {

    }   
}

}

如果有人可以帮助我,我将不胜感激。

4

1 回答 1

0

这与数据库无关,仅与以下两行有关:

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

变量n是 tyoe 的AsyncTask,因此应用toString()它只会给您提供您所描述的类的名称(com.example.testdb.MainActivity$Select@4203e900)。

您要做的是,将onPostExecute()您的课程的方法更改为Select

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

txtView.setText(n.toString());并从您的 onClick 处理程序中删除该行。

于 2013-07-19T10:03:34.597 回答