2012-07-28 82 views
0

我是Android新手,在java中生锈! 我一直在研究一个小程序,要求用户向EditText输入一些内容,一旦时间停止或用户单击完成按钮,它会在数据库中搜索用户设置的值。这就是说,我在那部分出现错误。 :(在Android中查询数据库时发生错误

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(); 
    } 
} 

,并且错误是:

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延伸活动{

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); 
    } 

}

回答

1

设计方面,独立的数据库建设和维护方面,从DB访问层本身。

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

下面是对此的代码片段...请注意,应用程序(活动)本身不应该知道任何内容,并且对数据库本身的构建没有可见性(请参阅DBHelper类本身的可见性),而只是具有完全可见性以简单的访问方法,比如打开,关闭,CRUD方法...


: 

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(); 
    } 

    : 
    : 
} 

活动用途的DB,你可以有一个叫setupDB()方法,方法是在创建过程中调用的活动:

private void setupDB() { 
    dbAccess = new DBAccess(this); 
    dbAccess.openDB(); 
} 

: 

private void searchDB() { 
    : 

    mStatusList = dbAccess.selectAllStatus(); 

    : 
} 

: 
: 
+0

首席执行官,谢谢。完成你所说的并且它非常棒,但是mStatusList = dbAccess.selectAllStatus()有问题;它表示对于类型DBAccess未定义。我也在Android开发者网站和谷歌搜索它。找不到它,并且不知道它的作用。 – Sheep 2012-07-29 17:53:44

+0

啊!还有一件事。要使用游标,我需要将其指向SQLitedatabase,但这是在DBAccess类中。 – Sheep 2012-07-29 18:15:24

+0

是的,以上是代码示例代码片段 - 您需要在DBAccess中定义适当的方法;在我的例子中,该方法被称为selectAllStatus()...而不是使用你自己的方法。这个想法是,游标等在DBAccess中,在一个将返回对象容器的方法中。在你的情况下,这种方法是searchDB(),但应该返回一个容器(列表)的对象,在你的情况下,你将处理的字符串(dbStuff),在你的情况下显示tvCounter。的setText( “是”); – CEO 2012-07-29 21:46:49

0

You ne编辑初始化数据库和它的帮手onCreate()

database = new SQLiteDatabase(); 
    dbHelper = new DatabaseHelper(); 
+0

'database'在这里初始化; 'database = dbHelper.getReadableDatabase();'但是'dbHelper'仍然需要被创建。之后他们也应该关闭。 – Sam 2012-07-28 18:15:23

+0

谢谢你的回复!但是我在数据库= new SQLiteDatabase()中收到错误; - >构造函数SQLiteDatabase()不可见。山姆,我没有得到你说的与dbHelper需要创建。 – Sheep 2012-07-28 19:06:37

+0

尝试'database = new SQLiteDatabase(context,DATABASE_NAME,null,1);' – 2012-07-29 07:44:27