繁体   English   中英

插入时Android sqlite数据库空指针异常

[英]Android sqlite database null pointer exception on Insert

我是一名新的android开发人员,当我尝试将数据插入sqlite数据库时遇到了空指针异常。

希望可以有人帮帮我。

这是我的代码:

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

private static final String TABLE_ALBUM = "table_album";
private static final String COL_ID = "ID";
private static final String COL_ARTIST = "ARTIST";
private static final String COL_TITLE = "TITLE";
private static final String CREATE_BDD = "CREATE TABLE " + TABLE_ALBUM
        + " (" + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + COL_ARTIST + " TEXT NOT NULL, " + COL_TITLE + " TEXT NOT NULL);";

public DatabaseHelper(Context context, String name, CursorFactory factory,
        int version) {
    super(context, name, factory, version);
    // TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(CREATE_BDD);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE " + TABLE_ALBUM + ";");
    onCreate(db);
}
}

Album_db.java

public class Album_db {

private static String DATABASE_NAME = "playlist.db";
private static final int VERSION_BDD = 1;
private static final String TABLE_ALBUM = "table_album";
private static final String COL_ID = "ID";
private static final String COL_ARTIST = "ARTIST";
private static final String COL_TITLE = "TITLE";    
private SQLiteDatabase db;
private DatabaseHelper oDB;

public Album_db(Context context) {

    oDB = new DatabaseHelper(context, DATABASE_NAME, null, VERSION_BDD);
}

public void open() {
    db = oDB.getWritableDatabase();
}

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

public SQLiteDatabase getBd() {
    return db;
}

public long insertAlbum(Album album) {
    ContentValues values = new ContentValues(); // hashmap
    values.put(COL_ARTIST, album.getArtist());
    values.put(COL_TITLE, album.getTitle());
    return db.insert(TABLE_ALBUM, null, values); // insert ds la base par le ContentValues
}

public int updateAlbum(int id, Album album) {
    ContentValues values = new ContentValues();
    values.put(COL_ARTIST, album.getArtist());
    values.put(COL_TITLE, album.getTitle());
    return db.update(TABLE_ALBUM, values, COL_ID + " = " + id,
            null);
}

public int removeAlbum(int id) {
    // Suppression BDD via id
    return db.delete(TABLE_ALBUM, COL_ID + " = " + id, null);
} 
public ArrayList<String> getAlbums() {
    ArrayList<String> output = new ArrayList<String>();

    String[] colonnesARecup = new String[] { "ARTIST", "TITLE" };

    Cursor cursorResults = db.query(TABLE_ALBUM, colonnesARecup,
            null, null, null, null, "ARTIST asc, TITLE asc", null);
    if (null != cursorResults) {
        if (cursorResults.moveToFirst()) {
            do {
                int columnIdxArtiste = cursorResults
                        .getColumnIndex("ARTIST");
                int columnIdxTitre = cursorResults.getColumnIndex("TITLE");
                String oItem = cursorResults.getString(columnIdxArtiste)
                        + " -  " + cursorResults.getString(columnIdxTitre);
                output.add(oItem);
            } while (cursorResults.moveToNext());
        }
    }
    return output;
}

PlayListActivity.java

public class PlayListActivity extends Activity implements OnClickListener {
/** Called when the activity is first created. */

private static final int CODE_ACTIVITY = 1;
Button btAdd;
Button btList;

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

    btAdd = (Button) findViewById(R.id.btAdd);
    btAdd.setOnClickListener(this);
    btList = (Button) findViewById(R.id.btTab2);
    btList.setOnClickListener(this);
}

public void onClick(View v) {
    // TODO Auto-generated method stub
    if (v == btAdd) {
        Album_db db = new Album_db(this);

        String artiste = ((EditText) this.findViewById(R.id.editArtist))
                .getText().toString();
        String titre = ((EditText) this.findViewById(R.id.editTitle))
                .getText().toString();

        Album album = new Album(artiste, titre);
        db.insertAlbum(album);
        updateList();
    }

    if (v == btList) {
        Intent oIntent = new Intent(PlayListActivity.this,
                ListActivity.class);
        startActivityForResult(oIntent, CODE_ACTIVITY);
        updateList();
    }
}

public void updateList() {
    Album_db db = new Album_db(this);
    ListView listeAlbum = (ListView) this.findViewById(R.id.albListView);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, db.getAlbums());
    listeAlbum.setAdapter(adapter);
}

日志:

    02-09 13:06:22.170: E/AndroidRuntime(531): FATAL EXCEPTION: main
02-09 13:06:22.170: E/AndroidRuntime(531): java.lang.NullPointerException
02-09 13:06:22.170: E/AndroidRuntime(531):  at test.themit.com.Album_db.insertAlbum(Album_db.java:42)
02-09 13:06:22.170: E/AndroidRuntime(531):  at test.themit.com.PlayListActivity.onClick(PlayListActivity.java:43)
02-09 13:06:22.170: E/AndroidRuntime(531):  at android.view.View.performClick(View.java:3511)
02-09 13:06:22.170: E/AndroidRuntime(531):  at android.view.View$PerformClick.run(View.java:14105)
02-09 13:06:22.170: E/AndroidRuntime(531):  at android.os.Handler.handleCallback(Handler.java:605)
02-09 13:06:22.170: E/AndroidRuntime(531):  at android.os.Handler.dispatchMessage(Handler.java:92)
02-09 13:06:22.170: E/AndroidRuntime(531):  at android.os.Looper.loop(Looper.java:137)
02-09 13:06:22.170: E/AndroidRuntime(531):  at android.app.ActivityThread.main(ActivityThread.java:4424)
02-09 13:06:22.170: E/AndroidRuntime(531):  at java.lang.reflect.Method.invokeNative(Native Method)
02-09 13:06:22.170: E/AndroidRuntime(531):  at java.lang.reflect.Method.invoke(Method.java:511)
02-09 13:06:22.170: E/AndroidRuntime(531):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-09 13:06:22.170: E/AndroidRuntime(531):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-09 13:06:22.170: E/AndroidRuntime(531):  at dalvik.system.NativeStart.main(Native Method)

您忘记调用db.open()

尝试这个

public void onClick(View v) {
    // TODO Auto-generated method stub
    if (v == btAdd) {
        Album_db db = new Album_db(this);
        db.open();
        String artiste = ((EditText) this.findViewById(R.id.editArtist))
                .getText().toString();
        String titre = ((EditText) this.findViewById(R.id.editTitle))
                .getText().toString();

        Album album = new Album(artiste, titre);
        db.insertAlbum(album);
        updateList();
        db.close();
    }

您需要先调用db.open()方法,然后再调用db.insertAlbum方法。 然后不要忘记调用db.close()

并且不要忘记在返回值之前在getAlbums()中关闭光标:

cursorResults.close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM