1

Я пытаюсь создать простое приложение базы данных с использованием SQLite, но похоже, что мне не удается получить ссылку на созданную базу данных. Я продолжаю получать NullPointerException, что указывает на команду getWriteableDatabase.NullPointerException at getWriteableDatabase

класс базы данных: класс

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:

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:

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) 

ответ

2

getWritableDatabase() запускает onCreate() в случае, если файл базы данных не существует. Ваши onCreate() вызовы newEntry(), которые принимает на себя db инициализирован, но правая рука уступке

db = this.getWritableDatabase(); 

все еще выполняется и db по-прежнему нулевой.

Использовать SQLiteDatabase в качестве параметра для onCreate() для операций настройки базы данных, таких как вставка значений по умолчанию.

+0

спасибо большое! объяснение механизма очень полезно – Lucky

Смежные вопросы