2011-09-14 5 views
0

이 문제가 발생했습니다. 나는 ListActivity를 가지고 있는데, 이후에 내 목록에서보고자하는 모든 데이터베이스 항목을 가져 오려고합니다.데이터베이스 항목을 커서에 입력하는 방법

이제 내 테이블에서 모든 데이터를 가져올 때 Nullpointer 예외 문제가 발생합니다. 2 단계에서 확인하십시오.

가 여기에 ListActivity의 코드입니다 :

package de.retowaelchli.filterit.stats; 


import de.retowaelchli.filterit.database.ADFilterDBAdapter; 
import android.app.ListActivity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 



public class CreatedADFilters extends ListActivity { 

    //Variablen deklaration 
    private ADFilterDBAdapter mDbHelper; 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     //Hier wir die Datenbank aufgerufen 
     mDbHelper = new ADFilterDBAdapter(this); 
     mDbHelper.open(); 
     System.out.println("STEP1"); //Until here it works 



     Cursor c = mDbHelper.getAllADFilter(); 
     startManagingCursor(c); 
     System.out.println("STEP2"); //Here's the problem I don't get. 


    } 

    } 

그래서 여기 내 DB-어댑터의 코드 부분 : 나는 내가 잘못 것을 얻을하지 않습니다

public Cursor getAllADFilter() { 

     return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID, 
       NAME, KEYWORD, CACHE }, null, null, null, null, null); 
    } 

, 제발 조언 좀 해줘.

미리 감사드립니다.

그래서 여기에이 표에 대한 전체 DB-어댑터의 :

package de.retowaelchli.filterit.database; 

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class ADFilterDBAdapter { 

     public static final String ROW_ID = "_id"; 
     public static final String NAME = "name"; 
     public static final String KEYWORD = "keyword"; 
     public static final String CACHE = "cache"; 

     private static final String DATABASE_TABLE = "adfilter"; 

     private DatabaseHelper mDbHelper; 
     private SQLiteDatabase mDb; 

     private final Context mCtx; 

     private static class DatabaseHelper extends SQLiteOpenHelper { 

      DatabaseHelper(Context context) { 
       super(context, DBAdapter.DATABASE_NAME, null, DBAdapter.DATABASE_VERSION); 
      } 

      @Override 
      public void onCreate(SQLiteDatabase db) { 
      } 

      @Override 
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      } 
     } 

     /** 
     * Constructor - takes the context to allow the database to be 
     * opened/created 
     * 
     * @param ctx 
     *   the Context within which to work 
     */ 
     public ADFilterDBAdapter(Context ctx) { 
      this.mCtx = ctx; 
     } 

     /** 
     * Open the ADFilter database. If it cannot be opened, try to create a new 
     * instance of the database. If it cannot be created, throw an exception to 
     * signal the failure 
     * 
     * @return this (self reference, allowing this to be chained in an 
     *   initialization call) 
     * @throws SQLException 
     *    if the database could be neither opened or created 
     */ 
     public ADFilterDBAdapter open() throws SQLException { 
      this.mDbHelper = new DatabaseHelper(this.mCtx); 
      this.mDb = this.mDbHelper.getWritableDatabase(); 
      return this; 
     } 

     /** 
     * close return type: void 
     */ 
     public void close() { 
      this.mDbHelper.close(); 
     } 

     /** 
     * Create a new ADFilter. If the car is successfully created return the new 
     * rowId for that ADFilter, otherwise return a -1 to indicate failure. 
     * 
     * @param name 
     * @param keyword 
     * @param cache 
     * @return rowId or -1 if failed 
     */ 
     public long createADFilter(String name, String keyword, String cache){ 
      ContentValues initialValues = new ContentValues(); 
      initialValues.put(NAME, name); 
      initialValues.put(KEYWORD, keyword); 
      initialValues.put(CACHE, cache); 
      return this.mDb.insert(DATABASE_TABLE, null, initialValues); 
     } 

     /** 
     * Delete the ADFilter with the given rowId 
     * 
     * @param rowId 
     * @return true if deleted, false otherwise 
     */ 
     public boolean deleteADFilter(long rowId) { 

      return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$ 
     } 

     /** 
     * Return a Cursor over the list of all ADFilter in the database 
     * 
     * @return Cursor over all ADFilters 
     */ 
     public Cursor getAllADFilter() { 

      return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID, 
        NAME, KEYWORD, CACHE }, null, null, null, null, null); 
     } 

     /** 
     * Return a Cursor positioned at the ADFilter that matches the given rowId 
     * @param rowId 
     * @return Cursor positioned to matching ADFilter, if found 
     * @throws SQLException if ADFilter could not be found/retrieved 
     */ 
     public Cursor getADFilter(long rowId) throws SQLException { 

      Cursor mCursor = 

      this.mDb.query(true, DATABASE_TABLE, new String[] { ROW_ID, NAME, 
        KEYWORD, CACHE}, ROW_ID + "=" + rowId, null, null, null, null, null); 
      if (mCursor != null) { 
       mCursor.moveToFirst(); 
      } 
      return mCursor; 
     } 

     /** 
     * Update the ADFilter 
     * 
     * @param rowId 
     * @param name 
     * @param keyword 
     * @param cache 
     * @return true if the note was successfully updated, false otherwise 
     */ 
     public boolean updateADFilter(long rowId, String name, String keyword, 
       String cache){ 
      ContentValues args = new ContentValues(); 
      args.put(NAME, name); 
      args.put(KEYWORD, keyword); 
      args.put(CACHE, cache); 

      return this.mDb.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) >0; 
     } 

    } 

그리고 여기에 글로벌 DB-어댑터의 : 나는 희망

package de.retowaelchli.filterit.database; 

import android.content.Context; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DBAdapter { 

    public static final String DATABASE_NAME = "filterit"; //$NON-NLS-1$ 

    public static final int DATABASE_VERSION = 1; 

    public static final String CREATE_TABLE_ADFILTER = 
     "create table adfilter (_id integer primary key autoincrement, " //$NON-NLS-1$ 
    + ADFilterDBAdapter.NAME+ " TEXT," //$NON-NLS-1$ 
    + ADFilterDBAdapter.KEYWORD+ " TEXT," //$NON-NLS-1$ 
    + ADFilterDBAdapter.CACHE+ " TEXT" + ");"; //$NON-NLS-1$ //$NON-NLS-2$ 

    private static final String CREATE_TABLE_SFILTER = "create table sfilter (_id integer primary key autoincrement, " //$NON-NLS-1$ 
    +SFilterDBAdapter.NAME+" TEXT," //$NON-NLS-1$ 
    +SFilterDBAdapter.KEYWORD+" TEXT," //$NON-NLS-1$ 
    +SFilterDBAdapter.COLOR+" TEXT,"//$NON-NLS-1$ //$NON-NLS-2$ 
    +SFilterDBAdapter.SMILEY+" TEXT"+ ");"; 

     private static final String CREATE_TABLE_ADMESSAGES = "create table admessages (_id integer primary key autoincrement, " //$NON-NLS-1$ 
    +ADMessagesDBAdapter.PHONENUMBER+" TEXT," //$NON-NLS-1$ 
    +ADMessagesDBAdapter.MESSAGE+" TEXT,"+ ");"; //$NON-NLS-1$ //$NON-NLS-2$ 


    private final Context context; 
    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    /** 
    * Constructor 
    * @param ctx 
    */ 
    public DBAdapter(Context ctx) 
    { 
     this.context = ctx; 
     this.DBHelper = new DatabaseHelper(this.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(CREATE_TABLE_ADFILTER); 
      db.execSQL(CREATE_TABLE_SFILTER); 
      db.execSQL(CREATE_TABLE_ADMESSAGES);   
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
     int newVersion) 
     {    
      // Adding any table mods to this guy here 
     } 
    } 

    /** 
    * open the db 
    * @return this 
    * @throws SQLException 
    * return type: DBAdapter 
    */ 
    public DBAdapter open() throws SQLException 
    { 
     this.db = this.DBHelper.getWritableDatabase(); 
     return this; 
    } 

    /** 
    * close the db 
    * return type: void 
    */ 
    public void close() 
    { 
     this.DBHelper.close(); 
    } 
} 

그 .. =) 밖으로 당신을 도와줍니다

+0

데이터베이스에 데이터가 없기 때문에 커서가 null 일 수 있습니다. – ingsaurabh

+0

어떻게 테스트 할 수 있습니까? 내가 어떻게 고칠 수, 그래서 nullpointer 예외가 없습니까? – safari

+0

데이터베이스 또는 테이블이 생성 되었습니까? 데이터베이스와 테이블이 있는지 확인하십시오. – WindsurferOak

답변

1

ingsaurabh으로 언급 했으므로 DB에 아무것도없는 것일 수 있습니다. 결과 집합이 비어 있어도 커서가 null이 아니어야합니다. 그냥 Cursor.getCount()는 0을 반환합니다. 결과 집합에 첫 번째 레코드로 진행하려면 항상 Cursor.moveToNext()를 수행해야합니다. 답변을 얻으려면 startManagingCursor 방법이 필요합니다.

+0

답변에 대한 답변이 네, DB 문제였습니다. 코드가 작동했습니다. 또한 팁을위한 thx! – safari

관련 문제