WritableDatabase时得到NullPointerEx

WritableDatabase时得到NullPointerEx

本文介绍了请尝试调用getWritableDatabase时得到NullPointerExceptions()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新来的Andr​​oid框架,我不能让过去的SQLite一垒。

I'm new to the Android framework and I can't get past first base with SQLite.

我试图建立一个具有EditText上的搜索框,这时候关键是pressed执行类似%字%搜索上一个SQLite数据库在的EditText框中输入的文字非常简单的应用,和在一个ListView显示结果。

I'm trying to build a very simple application that has a EditText search box, which when a key is pressed performs a Like %word% search on a SQLite database for for the text entered in the EditText box, and displays the results in a ListView.

N.B。下面code包括调试和评论code,抱歉,我没有得到全面清除它呢。

N.B. the below code included debugging and commented code, sorry I haven't got round to cleaning it up yet.

的激活是

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;

剪断,但你的想法。

snipped, but you get the idea.

    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处理

The SQLite database is handled by 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);
          }
       }
 }

现在每次数据库= helper.getWritableDatabase();被称为应用程序崩溃与一个NullPointerException异常。我已经设法跟踪误差OpenHelper和的onCreate方法db.beginTransaction();行了。

Now every time "database = helper.getWritableDatabase();" is called the app crashes with a NullPointerException. I've managed to trace the error to the onCreate method of OpenHelper and the "db.beginTransaction();" line.

我在想什么?

推荐答案

其实你并不需要辅助的onCreate方法来启动交易。尝试删除一切从法,但 db.execSQL(CREATE_TABLE_FEEDS);

Actually you do not need to start transaction at onCreate method of the helper. Try removing everything from the method except db.execSQL(CREATE_TABLE_FEEDS);

更新:我是能够重复的问题。

Update: I was able to repeat the problem.

移动fishDb场初始化活动的的onCreate()方法错误消失后。它看起来是不启动数据库初始化的onCreate调用之前不错的主意。

Move fishDb field initialization to the onCreate() method of activity after that error disappears. It looks like it is not good idea to start db initialization before the onCreate is invoked.

因此​​,而不是

fishDB fishDb = new fishDB(getApplicationContext());

DO

fishDB fishDb;

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

这篇关于请尝试调用getWritableDatabase时得到NullPointerExceptions()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 19:08