2010-08-23 57 views
1
ParsedNotificationDataSet result = new ParsedNotificationDataSet(); 
    Cursor c = db.rawQuery("select * from notificationtable", null); 
    if (c.getCount() > 0) { 
     c.moveToFirst(); 
     do { 
      result.setclassurl(c.getString(c.getColumnIndex("Id"))); 
      result.settype(c.getString(c.getColumnIndex("type"))); 
      result.setschool(c.getString(c.getColumnIndex("school"))); 
      result.setdescription(c.getString(c.getColumnIndex("description"))); 
      result.settitle(c.getString(c.getColumnIndex("title"))); 
      result.setdatePosted(c.getString(c.getColumnIndex("datePosted"))); 
      results.add(result); 
     } while (c.moveToNext()); 
    } 

這裏是我從數據庫中獲取數據的代碼。在我看來,它應該正常工作,但在第一次它會產生一個異常。之後,它運行沒有問題。我需要做些什麼修改來解決這個問題?android代碼從數據庫中獲取數據

+0

你可以發佈logcat錯誤輸出嗎? – 2010-08-23 05:52:14

+0

java.lang.NullPointerException logcat error – 2010-08-23 10:08:14

回答

2

我以這種方式使用過數據庫。你可以試試這種方式。 首先創建ContactDbAdapter類文件類似下面..

public class ContactDbAdapter { 

    public static final String KEY_NAME = "name"; 
    public static final String KEY_SCORE = "score"; 
    public static final String KEY_ROWID = "_id"; 

    private static final String DATABASE_CREATE = "create table contactdetails (_id integer primary key autoincrement," 
     + "name text not null, score integer not null);"; 

    private static final String DATABASE_NAME = "contacts"; 
    private static final String DATABASE_TABLE = "contactdetails"; 
    private static final int DATABASE_VERSION = 3; 

    public static final String TAG = "ContactDbAdapter"; 

private final Context mCtx; 
private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb; 

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 contactdetails"); 
     onCreate(db); 
    } 

} 

public ContactDbAdapter open() throws SQLiteException { 
    mDbHelper = new DatabaseHelper(mCtx);  
    try { 
     mDb = mDbHelper.getWritableDatabase(); 
     } catch (SQLiteException ex) { 
      mDb = mDbHelper.getReadableDatabase(); 
     } 
    return this; 
} 

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

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

public long createContact(String name, int score) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_NAME, name); 
    initialValues.put(KEY_SCORE, score);  

    return mDb.insert(DATABASE_TABLE, null, initialValues); 
} 

public int updateEntry(long _rowIndex, String name, int score) { 

     String where = KEY_ROWID + "=" + _rowIndex; 

     ContentValues initialValues = new ContentValues(); 
     initialValues.put(KEY_NAME, name); 
     initialValues.put(KEY_SCORE, score);  

     // TODO fill in the ContentValue based on the new object 
     return mDb.update(DATABASE_TABLE, initialValues, where, null); 
    } 

public boolean deleteContact(long rowId) { 
    Toast.makeText(this.mCtx, "RowID:" + rowId, Toast.LENGTH_LONG).show(); 
    return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
} 

public Cursor fetchAllContacts() { 
    String order = KEY_SCORE + " DESC "; 
    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, 
      KEY_SCORE}, null, null, null, null, order); 
    } 

} 

而且比你可以直接調用這個方法在你的活動Java類。

private ContactDbAdapter mDbHelper; 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mDbHelper = new ContactDbAdapter(this); 
     mDbHelper.open(); 

    Cursor cursor = mDbHelper.fetchAllContacts(); 
    startManagingCursor(cursor); 
} 

因此,這將從表中獲取所有記錄。然後遊標將按照您使用的相同方式使用。

+0

你有這個?其作品? – 2010-08-23 12:22:34

3

您可以嘗試下面的代碼。我認爲它會起作用,不會給出NullPointerException錯誤。

Cursor c = db.rawQuery("select * from notificationtable", null); 

if (c.getCount() > 0) { 
    while (cursor.moveToNext()) { 
    result.setclassurl(c.getString(c.getColumnIndex("Id"))); 
    result.settype(c.getString(c.getColumnIndex("type"))); 
    result.setschool(c.getString(c.getColumnIndex("school"))); 
    result.setdescription(c.getString(c.getColumnIndex("description"))); 
    result.settitle(c.getString(c.getColumnIndex("title"))); 
    result.setdatePosted(c.getString(c.getColumnIndex("datePosted"))); 
    results.add(result); 
    } 

} 
+0

當Cursor c = db.rawQuery(「select * from notificationtable」,null)時產生異常。正在執行 – 2010-08-23 09:43:40

+1

感謝它爲我工作:) – nifo 2011-01-01 19:11:39