Ошибка: заполнить представление списка из базы данных - PullRequest
1 голос
/ 29 декабря 2011

Я пытаюсь заполнить просмотр списка из базы данных. У меня есть действие, в котором я пишу имя, которое хранится в базе данных, и я хочу, чтобы оно отображалось в виде списка.

Вот моя активность, где у меня есть представление списка:

public class Liste extends ListActivity {

private ArrayList<String> results = new ArrayList<String>();
private String tableName = DBhelp.DATABASE_TABLE;
private SQLiteDatabase newDB;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Button bAdd = new Button(this);
 bAdd.setOnClickListener(new OnClickListener(){

            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent i = new Intent(Liste.this , Add.class);
                startActivity(i);
            }

        });
    openAndQueryDatabase();

    displayResultList();


}
private void displayResultList() {


    setListAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, results));
    getListView().setTextFilterEnabled(true);

}
private void openAndQueryDatabase() {
    try {
        DBhelp dbHelper = new DBhelp(this.getApplicationContext());
        newDB = dbHelper.getWritableDatabase();
        Cursor c = newDB.rawQuery("SELECT KEY_NAME " +
                tableName +
                " LIMIT 5", null);

        if (c != null ) {
            if  (c.moveToLast()) {
                do {
                    String firstName = c.getString(c.getColumnIndex("KEY_NAME"));

                    results.add(firstName);
                }while (c.moveToPrevious());
            } 
        }           
    } catch (SQLiteException se ) {
        Log.e(getClass().getSimpleName(), "Could not create or Open the database");
    } finally {

    }
    if (newDB != null) 
        newDB.execSQL("DELETE FROM " + tableName);
        newDB.close();
}
}

Здесь у меня есть помощник базы данных:

 public class DBhelp {

public static final String KEY_ROWID = "_id";
public static final String KEY_NAME = "persons_name";



private static final String DATABASE_NAME = "DBhelpdb";
static final String DATABASE_TABLE = "peopleTable";
private static final int DATABASE_VERSION = 1;

private DbHelper ourHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;


private static class DbHelper extends SQLiteOpenHelper{

    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" +
                KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                KEY_NAME + " TEXT NOT NULL);"


        );
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }

}

public DBhelp(Context c){
    ourContext = c;
}
public DBhelp open() throws SQLException{
    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}
public void close(){
    ourHelper.close();
}
public void createEntry(String name) {
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();
    cv.put(KEY_NAME, name);

    ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public String getData() {
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID, KEY_NAME};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
    String result = "";

    int iRow = c.getColumnIndex(KEY_ROWID);
    int iName = c.getColumnIndex(KEY_NAME);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){
        result = result + c.getString(iRow) + " " + c.getString(iName) + "\n";
    }

    return result;
}
public String getName(long l) {
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID, KEY_NAME};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null);
    if (c!=null){
        c.moveToFirst();
        String name = c.getString(1);
        return name;
    }
    return null;
}

public void updateEntry(long lRow, String mName) {
    // TODO Auto-generated method stub
    ContentValues cvUpdate = new ContentValues();
    cvUpdate.put(KEY_NAME, mName);
    ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "=" + lRow, null);
}
public void deteleEntry(long lRow1) {
    // TODO Auto-generated method stub
    ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + lRow1, null);
}
public SQLiteDatabase getWritableDatabase() {
    // TODO Auto-generated method stub
    return null;
}
}

Вот действие, в которое вставляются строки в базу данных:

 public class Add extends Activity implements OnClickListener{



Button sqlUpdate;//, sqlView, sqlModify, sqlGetInfo, sqlDelete;
EditText sqlName;//, sqlHotness, sqlRow;


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add);
    sqlUpdate = (Button) findViewById(R.id.bFinishAdd);
    //sqlView = (Button) findViewById(R.id.bSQLopenView);
    sqlName = (EditText) findViewById(R.id.etAdd);
    sqlUpdate.setOnClickListener(new OnClickListener(){

        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            boolean didItWork = true;

            try{
            String name = sqlName.getText().toString();

            DBhelp entry = new DBhelp(Add.this);
            entry.open();
            entry.createEntry(name);
            entry.close();
            Intent i = new Intent(Add.this, Liste.class);
            startActivity(i);

            }catch(Exception i){
                didItWork = false;
            }finally{
        }
        }


    });

}


public void onClick(View arg0) {
    // TODO Auto-generated method stub

}
}

При запуске приложения выдается ошибка. Я действительно не могу понять, в чем проблема. Я был бы очень признателен, если бы вы могли дать совет или совет или даже лучше, если бы вы могли сказать мне, в чем проблема. Мне жаль, что мой пост такой длинный, но я хочу дать вам все детали. Я действительно благодарю вас!

Вот логкат:

     12-29 00:58:16.852: E/AndroidRuntime(456):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at android.os.Handler.dispatchMessage(Handler.java:99)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at android.os.Looper.loop(Looper.java:123)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at android.app.ActivityThread.main(ActivityThread.java:4627)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at java.lang.reflect.Method.invokeNative(Native Method)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at java.lang.reflect.Method.invoke(Method.java:521)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at dalvik.system.NativeStart.main(Native Method)
 12-29 00:58:16.852: E/AndroidRuntime(456): Caused by: java.lang.NullPointerException
 12-29 00:58:16.852: E/AndroidRuntime(456):     at com.project.mapshop.Liste.openAndQueryDatabase(Liste.java:64)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at com.project.mapshop.Liste.onCreate(Liste.java:42)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
 12-29 00:58:16.852: E/AndroidRuntime(456):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
...