android – 尝试调用getWritableDatabase()时继续获取NullPointerExceptions

前端之家收集整理的这篇文章主要介绍了android – 尝试调用getWritableDatabase()时继续获取NullPointerExceptions前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 Android框架的新手,我无法通过sqlite获得第一个基础.

我正在尝试构建一个非常简单的应用程序,其中包含一个EditText搜索框,当按下某个键时,会在sqlite数据库上执行Like%word%搜索,以查找在EditText框中输入的文本,并将结果显示在列表显示.

注:下面的代码包括调试和注释代码,抱歉,我还没有完成清理它.

激活是

public class sustainable_fish extends Activity {

private String keycodeToAscii(int arg2){

    String retvar = "";

    switch(arg2){
    case KeyEvent.KEYCODE_A: retvar = "a";break;
    case KeyEvent.KEYCODE_B: retvar = "b";break;

剪掉了,但你明白了.

case KeyEvent.KEYCODE_RIGHT_BRACKET: retvar = ")";break;
    default: retvar = ""; break;
    };
    return retvar;

}



 Context that = getApplicationContext();
 fishDB dh = new fishDB(getApplicationContext());


private OnKeyListener search = new OnKeyListener() {

    public boolean onKey(View arg0,int arg1,KeyEvent arg2) {


        @SuppressWarnings("unused")
        Cursor cur = null;
        String searchData;
        EditText myEditText = (EditText) findViewById(R.id.fish_search);
        CharSequence edit_text_value = myEditText.getText();
        searchData = edit_text_value.toString();
        searchData = searchData + keycodeToAscii(arg2.getKeyCode() );
        Log.d("onKey","searchData = "+searchData);
        /*
        Commented out because as the database doesn't work,so theirs no point just yet searching.

        cur = fish.search(searchData);
        if (cur != null)
        {
            String[] displayFields = new String[] {cur.getString(2),cur.getString(1)};

            int[] displayViews = new int[] { R.id.fish_rank,R.id.fish_name};

            SimpleCursorAdapter adapter = new SimpleCursorAdapter(that,R.layout.text_list,cur,displayFields,displayViews);

            ListView myList=(ListView)findViewById(android.R.id.list);

            myList.setAdapter(adapter);
        } 
        */

        return false;
    }

};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

   setContentView(R.layout.main);
   EditText searchBar = (EditText) findViewById(R.id.fish_search);
   searchBar.setOnKeyListener(search); 

}

}

sqlite数据库由fishDB处理

public class fishDB {

 public static final String DATABASE_NAME = "fish.db3";
 public static final int DATABASE_VERSION = 1;
 private sqliteDatabase database;
 private Context myContext;
 private static boolean booFirstrun = false;

 fishDB(Context inContext){
     myContext = inContext;
     OpenHelper helper = new OpenHelper(myContext);
     Log.w("fishDB","Called OpenHelper");

             // Here be the problem...

     database = helper.getWritableDatabase();

 }

 public boolean firstRun(){
    return booFirstrun;
 }


   private static class OpenHelper extends sqliteOpenHelper {

       private static final String CREATE_TABLE_FeedS = "create table Feeds (Feed_id integer primary key autoincrement,"
           + "title text not null,url text not null);";

          OpenHelper(Context context) {
             super(context,DATABASE_NAME,null,DATABASE_VERSION);
             Log.w("OpenHelper","Called superconstructor");
            }

          @Override
          public void onCreate(sqliteDatabase db) {
              try {
              Log.w("OpenHelper","in onCreate");
              booFirstrun = true;
              Log.w("OpenHelper","set booFirstrun");
              db.beginTransaction();
              Log.w("OpenHelper","db.beginTransaction");
              try {
                  // Create tables and test data
                  db.execsql(CREATE_TABLE_FeedS);
                  Log.w("OpenHelper","execsql");
                  db.setTransactionSuccessful();
                  Log.w("OpenHelper","setTransactionSuccessful");
              } catch (sqlException e) {
                  Log.e("Error creating tables and debug data",e.toString());
                  throw e;
              } finally {
                  db.endTransaction();
              }
              } catch (Exception e) {
                  Log.e("OpenHelper",e.toString() );
              } finally {
              Log.w("OpenHelper","out of onCreate");
              }
          }

          @Override
          public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
             Log.w("OpenHelper","Upgrading database,this will drop tables and recreate.");
             onCreate(db);
          }
       } 
 }

现在每次“database = helper.getWritableDatabase();”被称为应用程序崩溃与NullPointerException.我设法将错误跟踪到OpenHelper的onCreate方法和“db.beginTransaction();”线.

我错过了什么?

解决方法

实际上,您不需要在帮助程序的onCreate方法上启动事务.尝试从除db.execsql(CREATE_TABLE_FeedS)之外的方法删除所有内容;

更新:我能够重复这个问题.

在该错误消失后,将fishDb字段初始化移动到活动的onCreate()方法.看起来在调用onCreate之前启动数据库初始化并不是一个好主意.

而不是

fishDB fishDb = new fishDB(getApplicationContext());

fishDB fishDb;

onCreate(){
  super.onCreate();
  fishDb = new fishDB(getApplicationContext());
  .... //init listener,query db etc..
}

猜你在找的Android相关文章