Как получить данные из моей базы данных и поместить их в ListView, который можно нажимать? - PullRequest
1 голос
/ 27 февраля 2012

Я пытаюсь выучить SQLite. Я хотел поместить информацию из базы данных (TextView) в ListView, который можно нажимать (у меня до сих пор нет представления о кликабельном ListView). Могу ли я получить некоторую помощь о том, как получить данные из моей базы данных и поместить их в ListView, на который можно нажимать? Вот код с учебного сайта, который я хотел иметь в ListView:

Button ViewBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    super.onCreate(savedInstanceState);
    setContentView(R.layout.sqlview);

    ViewBack=(Button) findViewById(R.id.bVBack);
    TextView tv = (TextView) findViewById(R.id.tvSQLinfo);
    ViewBack.setOnClickListener(this);

    HotOrNot info = new HotOrNot(this);
    info.open();
    String data = info.geData(); 
    info.close();
    tv.setText(data);

}
@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    finish();

}

sqlview.xml:

<ScrollView
      android:layout_width="fill_parent"
      android:layout_height="match_parent" >      
<TextView
    android:id="@+id/tvSQLinfo"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginTop="10dp"
    android:text="get info from db" />
</ScrollView>

Сначала я попытался поставить это:

ListView lv = (ListView) findViewById(R.id.listMe);
ListAdapter listAD = new ListAdapter(this,R.id.listMe, tv);
 lv.setAdapter(listAD);

но я получаю ошибку, которая не может создать экземпляр типа данных ListAdapter, поэтому я попытался заменить SimpleCursorAdapter на new ListAdapter(this,R.id.listMe,tv):

ListAdapter listAD = new SimpleCursorAdapter (this,R.id.listMe,tv, null, null);

, но это снова дает мне ошибку, оно предполагает, что я изменил приведение на Cursor, поэтому я изменил все это, пока оно не дало мне никаких ошибок. Когда я попытался запустить его, это не сработало. Вот HotOrNotClass:

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

private static final String DATABASE_NAME= "HotOrNotdb";
public 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, " +
                KEY_HOTNESS + " TEXT NOT NULL);"
        );  

    }

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

}
public HotOrNot(Context c){
    ourContext=c;
}

public HotOrNot open() throws SQLiteException{
ourHelper = new DbHelper(ourContext);
ourDatabase =ourHelper.getWritableDatabase();

return this;  }

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

public long createEntry(String name, String hotness) {
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();
    cv.put(KEY_NAME, name);
    cv.put(KEY_HOTNESS, hotness);
    return ourDatabase.insert(DATABASE_TABLE, null, cv);

}

public String geData() {
    // TODO Auto-generated method stub
    String[]columns=new String[]{ KEY_ROWID,KEY_NAME, KEY_HOTNESS};
    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);
    int iHotness=c.getColumnIndex(KEY_HOTNESS);

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

}
public String getName(long l) throws SQLiteException{
    // TODO Auto-generated method stub
    String[]columns=new String[]{ KEY_ROWID,KEY_NAME, KEY_HOTNESS};
    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 String getHotness(long l)throws SQLiteException {
    // TODO Auto-generated method stub
    String[]columns=new String[]{ KEY_ROWID,KEY_NAME, KEY_HOTNESS};
    Cursor c= ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID+"="+l, null, null, null, null);
    if (c!=null){
        c.moveToFirst();

        String hotness=c.getString(2);
        return hotness;
    }
    return null;
}

1 Ответ

3 голосов
/ 27 февраля 2012

Ваш метод getData() возвращает большое String со всеми результатами.Я не думаю, что это то, что вы хотите для своего списка, поэтому измените метод getData (), чтобы вы могли возвращать список String, представляющий записи вашей базы данных:

public ArrayList<String> geData() {
    // TODO Auto-generated method stub
    String[]columns=new String[]{ KEY_ROWID,KEY_NAME, KEY_HOTNESS};
    Cursor c =ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
    ArrayList<String> result = new ArrayList<String>();
    int iRow=c.getColumnIndex(KEY_ROWID);
    int iName=c.getColumnIndex(KEY_NAME);
    int iHotness=c.getColumnIndex(KEY_HOTNESS);

    for(c.moveToFirst(); !c.isAfterLast();c.moveToNext()){
        result.add(c.getString(iRow)+" "+c.getString(iName)+" "+c.getString(iHotness));
    }
    return result;
}

, чтобы показатьсписок, вам нужно будет поместить элемент ListView в макет Activity (sqlview), чтобы вы могли сделать макет следующим образом:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/bVBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Something" />

    <ListView
        android:id="@+id/listMe"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Затем в вашем методе onCreate() свяжитеListView до Adapter:

//...
ListView lv = (ListView) findViewById(R.id.listMe);
HotOrNot info = new HotOrNot(this);
info.open();
ArrayList<String> data = info.geData(); 
info.close();
lv.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item1, data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...