2012-04-09 73 views
4

我试图从我创建的数据库中读取数据,但是在尝试获取所有记录时,我总是得到一个NullPointerException。在SQLite数据库上执行查询时出现NullPointerException

我几乎从另一个应用程序中拷贝了代码,我已经完美运行了,但不知何故,我在这里做错了。

的NullPointerException异常是在

return mDb.query(DATABASE_TABLE_LOCALLOGIN, new String[] {LOCALLOGIN_ID, LOCALLOGIN_LOGIN, LOCALLOGIN_PASSWORD}, null, null, null, null, null); 

行下面是相关的代码(不介意字符串数组,其后来添加表: GoingOutDbAdapter.java

public class GoingOutDbAdapter { 
private static final String DATABASE_NAME = "GoingOutData"; 
private static final String DATABASE_TABLE_LOCALLOGIN = "LocalLogin"; 

public static final String LOCALLOGIN_ID = "LocalLogin_id"; 
public static final String LOCALLOGIN_LOGIN = "Login"; 
public static final String LOCALLOGIN_PASSWORD = "Password"; 

private static final String TAG = "Debugstring"; 

private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb; 

private static final String[] DATABASE_CREATE = { 
    "CREATE Table " + DATABASE_TABLE_LOCALLOGIN + " (" 
    + LOCALLOGIN_ID + " integer PRIMARY KEY Autoincrement, " 
    + LOCALLOGIN_LOGIN + " text NOT NULL, " 
    + LOCALLOGIN_PASSWORD + " text NOT NULL);"}; 

private final Context mCtx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 
    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     for(int i = 0; i < DATABASE_CREATE.length; i++){ 
      Log.d(TAG,DATABASE_CREATE[i]); 
      db.execSQL(DATABASE_CREATE[i]); 
     } 
    } 
} 

public GoingOutDbAdapter(Context ctx) { 
    this.mCtx = ctx; 
} 

public GoingOutDbAdapter open() throws SQLException { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mDbHelper.close(); 
} 

public Cursor fetchAllLocalLogins() { 
    return mDb.query(DATABASE_TABLE_LOCALLOGIN, new String[] {LOCALLOGIN_ID, LOCALLOGIN_LOGIN, LOCALLOGIN_PASSWORD}, null, null, null, null, null); 
} 

} 

MyActivity .java,我叫fetchAllLocalLogins

public class MyActivity extends Activity { 
/** Called when the activity is first created. */ 

private GoingOutDbAdapter mDbHelper; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    mDbHelper = new GoingOutDbAdapter(this); 

    setContentView(R.layout.main); 

Cursor localLogin = mDbHelper.fetchAllLocalLogins(); 

} 
} 
+0

在这里发表您的logcat – 2012-04-09 09:06:53

回答

11

你会大概要调用的方法open()您进行查询之前:

//... 
mDbHelper.open(); //whitout this call mdb will be NULL 
Cursor localLogin = mDbHelper.fetchAllLocalLogins(); 
+0

这样做,现在我得到 “android.database.CursorIndexOutOfBoundsException:指数-1要求,尺寸为1”“mLoginField.setText(localLogin.getString(localLogin.getColumnIndexOrThrow(GoingOutDbAdapter.LOCALLOGIN_LOGIN) ));”在我的内容视图中使用mLoginField作为EditText – 2012-04-09 09:41:08

+0

@MatsRaemen从查询返回的'Cursor'位于'-1'处,因此您应该在调用'localLogin.moveToFirst()'或'localLogin.moveToNext()'之前你试图获取数据。 – Luksprog 2012-04-09 09:43:16

+0

你又救了我,非常感谢! – 2012-04-09 09:59:30

1

你应该执行数据库操作之前打开数据库。 mDbHelper.open();

相关问题