首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android中查询数据库时出错

在Android中查询数据库时出错
EN

Stack Overflow用户
提问于 2012-07-29 02:02:29
回答 2查看 122关注 0票数 0

我是Android编程的新手,对java也很陌生!我一直在开发一个小程序,要求用户在EditText中输入一些内容,一旦时间停止或用户单击Finish按钮,它就会在数据库中搜索用户设置的值。也就是说,我在这一部分中遇到了错误。:(

代码语言:javascript
复制
public class UserScreen extends Activity implements View.OnClickListener {

    public TextView tvCounter;
    public EditText input;
    public Button finish;

    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gamescreen);

        tvCounter = (TextView) findViewById(R.id.tvCounter);
        finish = (Button) findViewById(R.id.bFinish);
        finish.setOnClickListener(this);

        new CountDownTimer(30000, 1000) {

            public void onTick(long millisUntilFinished) {
                tvCounter.setText("seconds remaining: "
                        + Long.toString(millisUntilFinished / 1000));
            }

            public void onFinish() {
                tvCounter.setText("done!");
                searchDB();
            }
        }.start();
    }

    private SQLiteDatabase database;
    private DatabaseHelper dbHelper;

    public void searchDB() {
        Object tableList[] = { "table1", "table2", "table3", "table4",
                "table5", "table6" };
        Object columnList[] = { "column1", "column2", "column3", "column4", "column5", "column6" };
        int pList[] = { R.id.et1, R.id.et2, R.id.et3,
                R.id.et4, R.id.et5, R.id.et6 };

        database = dbHelper.getReadableDatabase();
        Cursor cursor = null;

        for (int i = 0; i < tableList.length; i++) {

            input = (EditText) findViewById(pList[i]);
            String data = input.getText().toString();

            cursor = database.rawQuery("SELECT * FROM " + tableList[i]
                    + " WHERE " + pList[i] + " = " + columnList[i], null);

            String dbStuff = cursor.toString();
                        if (dbStuff == data) { 
                            tvCounter.setText("YEAH");
                        } 
                        else { 
                        tvCounter.setText("DAMN"); 
                        }
        }
        cursor.close();
    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        searchDB();
    }
}

错误是:

代码语言:javascript
复制
07-28 17:43:59.385: E/AndroidRuntime(920): FATAL EXCEPTION: main
07-28 17:43:59.385: E/AndroidRuntime(920): java.lang.NullPointerException
07-28 17:43:59.385: E/AndroidRuntime(920): at com.example.androidgame.GameScreen.searchDB(GameScreen.java:56)
07-28 17:43:59.385: E/AndroidRuntime(920): at com.example.androidgame.GameScreen.onClick(GameScreen.java:84)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.view.View.performClick(View.java:3511)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.view.View$PerformClick.run(View.java:14105)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.os.Handler.handleCallback(Handler.java:605)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.os.Handler.dispatchMessage(Handler.java:92)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.os.Looper.loop(Looper.java:137)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-28 17:43:59.385: E/AndroidRuntime(920): at java.lang.reflect.Method.invokeNative(Native Method)
07-28 17:43:59.385: E/AndroidRuntime(920): at java.lang.reflect.Method.invoke(Method.java:511)
07-28 17:43:59.385: E/AndroidRuntime(920): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-28 17:43:59.385: E/AndroidRuntime(920): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-28 17:43:59.385: E/AndroidRuntime(920): at dalvik.system.NativeStart.main(Native Method)

对DB的创建或访问在另一个类中。

公共类DBAccess扩展了Activity {

代码语言:javascript
复制
private DatabaseHelper databaseHelper;
private SQLiteDatabase db;


public void onCreate(Context context){
    databaseHelper = new DatabaseHelper(context);
    searchDB();
}

public void openDB(){
    db = databaseHelper.getWritableDatabase();
}
public void closeDB(){
    db.close();
}
public void searchDB(){
    Intent Scoring = getIntent();
    String rawdata[] = Scoring.getStringArrayExtra("data");
    openDB();
    Object tableList[] = { "table1", "table2", "table3", "table4", "table5", "table6" };
    Object columnList[] = { "KEY_COLUMN1", "KEY_COLUMN2", "KEY_COLUMN3", "KEY_COLUMN4", "KEY_COLUMN5",
    "KEY_COLUMN6" };

    int downScore = 0;
    int upScore = 0;
    String dbStuff;

    Cursor cursor = null;

    for (int i = 0; i < tableList.length; i++) {
        if(rawdata[i] == "niente")
            downScore = downScore + 5;
        else {
            cursor = db.rawQuery("SELECT * FROM " + tableList[i] + " WHERE " + rawdata[i] + " = " + columnList[i] , null);
        dbStuff = cursor.toString();
        if (i == 0)
             cursor.moveToFirst();
        else
            cursor.moveToNext();
        if(dbStuff == rawdata[i])
            upScore = upScore + 10;
        else
            downScore = downScore + 5;
        }
    }
    closeDB();
    cursor.close();
    Intent i = new Intent(this, ScoreScreen.class);
    i.putExtra("uScore", upScore);
    i.putExtra("dScore", downScore);
    }

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-29 05:26:05

在设计方面,将DB构造和维护方面与DB访问层本身分开。

为此,有两个类。1)把所有的构造和维护都放在DBHelper.java中,2) DBAccess.java有访问数据库的方法。

下面是这个的代码片段。请注意,应用程序(活动)本身应该对DB本身的构造一无所知,并且没有可见性(参见DBHelper类本身的可见性),而只对简单的访问方法(如open、close、CRUD方法)具有完全可见性……

代码语言:javascript
复制
:

class DBHelper extends SQLiteOpenHelper {

    :
    :

    private SQLiteDatabase db;
    private static final int DATABASE_VERSION = 1;
    private static final String DB_NAME = "dbname.db";
    :
    :

}

public class DBAccess {

    :
    :

    private DBHelper dbHelper;
    private SQLiteDatabase db;

    :
    :

    public DBAccess(Context context) {
        dbHelper = new DBHelper(context);
    }

    /**
     * Open the database
     */
    public void openDB() {
        db = dbHelper.getWritableDatabase();
    }

    /**
     * Close the database
     */
    public void closeDB() {
        db.close();
    }

    :
    :
}

activity使用DB,您可以有一个名为setupDB()的方法,该方法在创建activity时调用:

代码语言:javascript
复制
private void setupDB() {
    dbAccess = new DBAccess(this);
    dbAccess.openDB();
}

:

private void searchDB() {
    :

    mStatusList = dbAccess.selectAllStatus();

    :
}

:
:
票数 1
EN

Stack Overflow用户

发布于 2012-07-29 02:04:52

您需要初始化数据库,它是onCreate()中的帮助器

代码语言:javascript
复制
  database = new SQLiteDatabase();
  dbHelper = new DatabaseHelper();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11703445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档