Android SQLite:如何使查询工作?

时间:2013-02-28 14:40:36

标签: java android database sqlite

这是MainActivity.java

package com.example.sqltwo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MainActivity extends Main {
public static final String KEY_NAMES = "";
public static final String KEY_VALUES = "";

private static final String DATABASE_NAME = "Database";
private static final String DATABASE_TABLE = "DBTable";
private static final int DATABASE_VERSION = 1;

private DbHelper qhelper;
private final Context qcontext;
private SQLiteDatabase qdatabase;

private static class DbHelper extends SQLiteOpenHelper{

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
            KEY_NAMES + " TEXT NOT NULL, " +
            KEY_VALUES + " TEXT NOT NULL);"
            );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

    }
}
public MainActivity(Context c){
    qcontext = c;
}
public MainActivity open() throws SQLException{
    qhelper = new DbHelper(qcontext);
    qdatabase = qhelper.getWritableDatabase();
    return this;
}
public void close(){
    qhelper.close();
}

public long createEntry(String name, String value) {
    ContentValues cv = new ContentValues();
            cv.put(KEY_NAMES, name);
            cv.put(KEY_VALUES, value);
            return qdatabase.insert(DATABASE_TABLE, null, cv);
}
public String getData() {
    String[] columns = new String[]{KEY_NAMES, KEY_VALUES};
    Cursor c = qdatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
    String result = "";

    int iValue = c.getColumnIndex(KEY_VALUES);
    int iName = c.getColumnIndex(KEY_NAMES);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        result = result + c.getString(iName) + "\n" + c.getString(iValue) + "\n";
    }
    return result;  
}   
}

这是Main.java

package com.example.sqltwo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Main extends Activity implements OnClickListener{
Button sqlUpdate, sqlView, sqlQuery;
EditText sqlName, sqlValue, sqlQuery_value;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sqlUpdate = (Button) findViewById(R.id.buttonupdate);
    sqlName = (EditText) findViewById(R.id.editname);
    sqlValue = (EditText) findViewById(R.id.editvalue);
    sqlView = (Button) findViewById(R.id.buttonview);
    sqlView.setOnClickListener(this);
    sqlUpdate.setOnClickListener(this);
    sqlQuery = (Button) findViewById(R.id.buttonsearch);
    sqlQuery_value = (EditText) findViewById(R.id.editquery);
}
public void onClick(View arg0) {
    switch (arg0.getId()) {
    case R.id.buttonupdate:
        String name = sqlName.getText().toString();
        String value = sqlValue.getText().toString();
        MainActivity entry = new MainActivity(Main.this);
        entry.open();
        entry.createEntry(name, value);
        entry.close();
        break;
    case R.id.buttonview:
        Intent intentone = new Intent();
        intentone.setClassName("com.example.sqltwo", "com.example.sqltwo.View");
        startActivity(intentone);
        break;
    }
}
}

我的错误

02-28 09:23:07.334: E/AndroidRuntime(827): android.database.sqlite.SQLiteException: duplicate column name: TEXT (code 1): , while compiling: CREATE TABLE DBTable ( TEXT NOT NULL,  TEXT NOT NULL);

我想要这样做?

您可以输入名称和值,并将数据更新到数据库中。 视图功能尚未编码。 我需要输入数据,而不会发生崩溃。 我需要在MainActivity中设置一个查询系统,它将与Main中的switch-case系统一起使用。 当我输入查询时,如何将数据发送到MainActivity,运行搜索然后返回有效值列表?

- 额外: 如何在显示更多数据时添加行的表格中显示每个查询返回的数据集?

- 额外: 我可以让某人实时帮助我吗?要问太多了?

2 个答案:

答案 0 :(得分:2)

创建对象时,您还没有列的名称。你必须传递带有列名的参数或初始化变量,如Malaka所说。

public static final String KEY_NAMES = "column1";
public static final String KEY_VALUES = "column2";

答案 1 :(得分:1)

您需要为列(KEY_NAMESKEY_VALUES)提供唯一名称。

尝试:

public static final String KEY_NAMES = "column1";
public static final String KEY_VALUES = "column2";

您可以将column1column2更改为您想要的任意两个不同的字符串,只要您记得在整个应用中使用相同的名称引用它们。

  

当我输入查询时,如何将数据发送到MainActivity,运行搜索然后返回有效值列表?

只需使用输入值在数据库上运行SQL语句。

  

-Extra:如何在显示更多数据时添加行的表格中显示每个查询返回的数据集?

拥有显示行的UI。执行select语句,遍历返回的游标并填充每一行。更新数据库后,只需再次运行select语句并重新填充UI。如果添加主键,则可以运行后续select语句,该语句仅查找比最后一行主键更新的数据。

  

-Extra:我可以让某人实时帮助我吗?要问太多了?

雇用某人寻求独家帮助。