2010-10-05 54 views
0

“return db.insert(DATABASE_TABLE,null,initialValues);”正在返回一个空指针,我不知道为什么!在Android上的SQLite中插入新记录时出现问题

public class DBAdapter 
{ 
    public static final String KEY_ROWID = "_id"; 
    public static final String KEY_USERNAME = "username"; 
    public static final String KEY_PASSWORD = "password"; 
    private static final String TAG = "DBAdapter"; 

    private static final String DATABASE_NAME = "test"; 
    private static final String DATABASE_TABLE = "users"; 
    private static final int DATABASE_VERSION = 1; 

    private static final String DATABASE_CREATE = 
     "create table IF NOT EXISTS users (_id integer primary key autoincrement, " 
     + "username text, password text);"; 

    private final Context context; 

    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    public DBAdapter(Context ctx) 
    { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
    } 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

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

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
     int newVersion) 
     { 
      Log.w(TAG, "Upgrading database from version " + oldVersion 
        + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS titles"); 
      onCreate(db); 
     } 
    }  

    //---opens the database--- 
    public DBAdapter open() throws SQLException 
    { 
     db = DBHelper.getWritableDatabase(); 
     return this; 
    } 

    //---closes the database---  
    public void close() 
    { 
     DBHelper.close(); 
    } 

    //---insert a title into the database--- 
    public long insertUser(String username, String password) 
    { 
     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_USERNAME, username); 
     initialValues.put(KEY_PASSWORD, password); 
     return db.insert(DATABASE_TABLE, null, initialValues); 
    } 

    //---deletes a particular title--- 
    public boolean deleteTitle(long rowId) 
    { 
     return db.delete(DATABASE_TABLE, KEY_ROWID + 
      "=" + rowId, null) > 0; 
    } 

    //---retrieves all the titles--- 
    public Cursor getAllUsers() 
    { 
     return db.query(DATABASE_TABLE, new String[] { 
      KEY_ROWID, 
      KEY_USERNAME, 
      KEY_PASSWORD, 
       }, 
       null, 
       null, 
       null, 
       null, 
       null); 
    } 

    //---retrieves a particular title--- 
    public Cursor getUser(long rowId) throws SQLException 
    { 
     Cursor mCursor = 
       db.query(true, DATABASE_TABLE, new String[] { 
        KEY_ROWID, 
        KEY_USERNAME, 
        KEY_PASSWORD,     
        }, 
        KEY_ROWID + "=" + rowId, 
        null, 
        null, 
        null, 
        null, 
        null); 
     if (mCursor != null) { 
      mCursor.moveToFirst(); 
     } 
     return mCursor; 
    } 

    //---updates a title--- 
    public boolean updateTitle(long rowId, String username, 
    String password) 
    { 
     ContentValues args = new ContentValues(); 
     args.put(KEY_USERNAME, username); 
     args.put(KEY_PASSWORD, password); 

     return db.update(DATABASE_TABLE, args, 
         KEY_ROWID + "=" + rowId, null) > 0; 
    } 
} 
+0

另外,'onCreate'可以调用'null'DBAdapter'上的'close()'。 – 2010-10-07 16:55:56

回答

2

Getwriteabledatabase有到插入之前被称为 - 我的任何帮助

public class Database extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   
    DBAdapter db = new DBAdapter(this); 
    if(db != null){ 
    long id = db.insertUser("test", "test"); 
    Cursor c = db.getUser(id);   
    Log.d("DB", c.getString(1)); 
    Log.d("DB", c.getString(2)); 
    } 
    db.close(); 
} 
} 

不胜感激。我在open()中看到它,但是我没有看到open被调用的地方。这是我最好的猜测。