首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NullPointerException at getWriteableDatabase

NullPointerException at getWriteableDatabase
EN

Stack Overflow用户
提问于 2015-02-15 20:31:56
回答 1查看 73关注 0票数 1

我试图使用SQLite创建简单的数据库应用程序,但看起来我无法获得对创建的数据库的引用。我一直得到NullPointerException,它指向getWriteableDatabase命令。

数据库类:

代码语言:javascript
运行
复制
public class DatabaseHelper extends SQLiteOpenHelper {

public SQLiteDatabase db;

public static final String DATABASE_NAME = "user_database.db";
public static final String DATABASE_TABLE_NAME = "users";
public static final int DATABASE_VERSION = 1;
public static final String USER_ID = "_id";
public static final String USER_NAME = "user_name";
public static final String USER_SURNAME = "user_surname";

private static final String DATABASE_CREATE =
        "CREATE TABLE " +
        DATABASE_TABLE_NAME +
        " ( " +
        USER_ID +
        " INTEGER PRIMARY KEY AUTOINCREMENT, " +
        USER_NAME +
        " TEXT, " +
        USER_SURNAME +
        " TEXT);";

public DatabaseHelper(Context context)
{
    super(context, DATABASE_NAME, null, DATABASE_VERSION);

    db = this.getWritableDatabase();
}

@Override
public void onCreate(SQLiteDatabase db) 
{
    db.execSQL(DATABASE_CREATE);

    newEntry("Lorem", "Ipsum");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w(DatabaseHelper.class.getName(),
            "Upgrading database from version " +
                    oldVersion +
                    " to " +
                    newVersion);
    db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_NAME);
    onCreate(db);
}

public Cursor newEntry(String name, String surname)
{
    ContentValues cv = new ContentValues();
    cv.put(USER_NAME, name);
    cv.put(USER_SURNAME, surname);
    long id = db.insert(DATABASE_TABLE_NAME, null, cv);

    Cursor cursor = db.query(DATABASE_TABLE_NAME, new String[] {USER_ID, USER_NAME, USER_SURNAME}, USER_ID + " = " + id, null, null, null, null);

    return cursor;
}

public Cursor selectAll()
{
    return db.query(DatabaseHelper.DATABASE_TABLE_NAME, new String[] {USER_ID, USER_NAME, USER_SURNAME}, null, null, null, null, null);
}
}

UI类:

代码语言:javascript
运行
复制
public class Insert extends Activity implements View.OnClickListener {
public DatabaseHelper myHelper;
public Button button3;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_insert);

    button3 = (Button)findViewById(R.id.button3);
    button3.setOnClickListener(this);
}

public void onClick(View v)
{
    String name, surname;
    EditText input;
    Cursor cursor;
    Intent intent;

    input = (EditText) findViewById(R.id.editText1);
    name = input.getText().toString();

    input = (EditText) findViewById(R.id.editText2);
    surname = input.getText().toString();

    myHelper = new DatabaseHelper(this);
    cursor = myHelper.newEntry(name, surname);

    if(cursor.moveToFirst())
    {
        Toast.makeText(this, "Entry added.", Toast.LENGTH_LONG).show();
    }
    else
    {
        Toast.makeText(this, "Entry not added.", Toast.LENGTH_LONG).show();
    }

    cursor.close();

    intent = new Intent(this, Main.class);
    startActivity(intent);
}
}

LogCat:

代码语言:javascript
运行
复制
02-15 20:12:31.117: E/AndroidRuntime(2678): FATAL EXCEPTION: main
02-15 20:12:31.117: E/AndroidRuntime(2678): Process: com.example.userdatabase, PID: 2678
02-15 20:12:31.117: E/AndroidRuntime(2678): java.lang.NullPointerException
02-15 20:12:31.117: E/AndroidRuntime(2678):     at com.example.userdatabase.DatabaseHelper.newEntry(DatabaseHelper.java:66)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at com.example.userdatabase.DatabaseHelper.onCreate(DatabaseHelper.java:47)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at com.example.userdatabase.DatabaseHelper.<init>(DatabaseHelper.java:39)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at com.example.userdatabase.Insert.onClick(Insert.java:38)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.view.View.performClick(View.java:4438)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.view.View$PerformClick.run(View.java:18422)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.os.Handler.handleCallback(Handler.java:733)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.os.Handler.dispatchMessage(Handler.java:95)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.os.Looper.loop(Looper.java:136)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at android.app.ActivityThread.main(ActivityThread.java:5001)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at java.lang.reflect.Method.invokeNative(Native Method)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at java.lang.reflect.Method.invoke(Method.java:515)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
02-15 20:12:31.117: E/AndroidRuntime(2678):     at dalvik.system.NativeStart.main(Native Method)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-15 20:36:55

如果数据库文件不存在,getWritableDatabase()将触发onCreate()。您的onCreate()调用newEntry(),它假定db已经初始化,但是赋值的右侧

代码语言:javascript
运行
复制
db = this.getWritableDatabase();

仍在执行中,db仍为空。

将传入的SQLiteDatabase作为参数传递给onCreate(),用于数据库设置操作,例如插入默认值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28530821

复制
相关文章

相似问题

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