簡體   English   中英

從sqlite檢索值到android listview

[英]Retrieve values from sqlite to android listview

     t1=(TextView)findViewById(R.id.s1);
     t2=(TextView)findViewById(R.id.s2);
     t3=(TextView)findViewById(R.id.s3);
     t4=(TextView)findViewById(R.id.s4);

        dbase=openOrCreateDatabase("reg_db", Context.MODE_PRIVATE, null);
        dbase.execSQL("create table if not exists registration(name       varchar(40),age number(5),casestudy varchar(100),gender varchar(10),phonenumber varchar(12),doctorname varchar(50),date DATE,time varchar(5))");


        Cursor c=dbase.query("registration",new String[]{"name","age","casestudy","gender","phonenumber","doctorname","date","time"}, null, null, null, null, null);
        while(c.moveToNext()){
        String  c1=c.getString(0);
        String  c2=c.getString(1);
        String  c3=c.getString(2);
        String  c4=c.getString(3);
        String  c5=c.getString(4);
        String  c6=c.getString(5);
        String  c7=c.getString(6);
        String  c8=c.getString(7);
        t1.setText(c1);
        t2.setText(c5);
        t3.setText(c7);
        t4.setText(c8);

我只能在我的表格中顯示一行如何以列表形式顯示所有行...請指定謝謝

在while循環之前使用這個

您需要將光標設置在第一個位置

  if (c!= null) {

        //more to the first row
        c.moveToFirst();



while(c.moveToNext()){
        String  c1=c.getString(0);
        String  c2=c.getString(1);
        String  c3=c.getString(2);
        String  c4=c.getString(3);
        String  c5=c.getString(4);
        String  c6=c.getString(5);
        String  c7=c.getString(6);
        String  c8=c.getString(7);
        t1.setText(c1);
        t2.setText(c5);
        t3.setText(c7);
        t4.setText(c8);
}
}

使用此代碼:

 if(c!=null)
  {
    if (c.moveToFirst()) {
      do {
        String  c1=c.getString(0);
        String  c2=c.getString(1);
        String  c3=c.getString(2);
        String  c4=c.getString(3);
        String  c5=c.getString(4);
        String  c6=c.getString(5);
        String  c7=c.getString(6);
        String  c8=c.getString(7);
        t1.setText(c1);
        t2.setText(c5);
        t3.setText(c7);
        t4.setText(c8);

       } while (c.moveToNext());
     }
  }
if (c.moveToFirst()){
   do{
      // do what ever you want here
   }while(.moveToNext());
}
c.close();

我認為您似乎正在嘗試填充 ListView,而 ListView 將為每一行/條目提供另一個布局,這是由適配器指向的。

也就是說,要填充 Listview,您需要有一個適配器。 適配器將使用定義每個條目(行)的 XML 布局,這些布局是包含 ListView 和活動的布局。

這是自定義光標適配器的示例:-

package mjt.shopper;

import android.content.Context;
import android.database.Cursor;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

/**
 * Created by Mike092015 on 6/02/2016.
 */
class AislesCursorAdapter extends CursorAdapter {
    public AislesCursorAdapter(Context context, Cursor cursor, int flags) {
        super(context, cursor, 0);
    }
    @Override
    public View getView(int position, View convertview, ViewGroup parent) {
        View view = super.getView(position, convertview, parent);
        Context context = view.getContext();
        if (position % 2 == 0) {
            view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorlistviewroweven));
        } else {
            view.setBackgroundColor(ContextCompat.getColor(context, R.color.colorlistviewrowodd));
        }
        return view;
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView textviewaisleid = (TextView) view.findViewById(R.id.aisle_id_entry);
        TextView textviewaislename = (TextView) view.findViewById(R.id.aisle_name_entry);
        TextView textviewaisleorder = (TextView) view.findViewById(R.id.aisle_order_entry);
        TextView textviewaisleshopref = (TextView) view.findViewById(R.id.aisle_shopref_entry);

        textviewaisleid.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_ID_INDEX));
        textviewaislename.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_NAME_INDEX));
        textviewaisleorder.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_ORDER_INDEX));
        textviewaisleshopref.setText(cursor.getString(ShopperDBHelper.AISLES_COLUMN_SHOP_INDEX));
    }
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        return LayoutInflater.from(context).inflate(R.layout.activity_aisle_list_entry, parent, false);
    }
}

getView 方法並不重要,可以省略(在上面它交替行/條目的顏色)。

您將需要 bindView 方法,顯然是根據您的需要量身定制的(前半部分獲取要填充的視圖,后半部分設置視圖,您可能會注意到它看起來與您的部分代碼相似)。

您還需要 newView 方法,它基本上設置要用於 ListView 的每一行/條目的布局(即以下 XML)。

筆記! ShopperDBHelper.AISLES_COLUMN_???_INDEX 包含進入游標的索引

這是一個 XML 示例(上述適配器使用的那個):-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/standard_listview_row_padding_vertical"
    android:paddingLeft="@dimen/standard_listview_row_padding_horizontal"
    android:paddingRight="@dimen/standard_listview_row_padding_horizontal"
    android:paddingTop="@dimen/standard_listview_row_padding_vertical"
    tools:context=".AisleListEntryActivity">
    <!-- Aisle ID 4 debugging -->
    <TextView
        android:id="@+id/aisle_id_entry"
        android:layout_width="30sp"
        android:layout_height="@dimen/rowheight"
        android:textSize="@dimen/standard_listview_text_size"
        android:visibility="visible"/>
    <!-- Aisle Name -->
    <TextView
        android:id="@+id/aisle_name_entry"
        android:layout_width="@dimen/ailsename_text_size"
        android:layout_height="@dimen/rowheight"
        android:textSize="@dimen/standard_listview_text_size"
        android:textStyle="bold" />
    <!-- Aisle Order-->
    <TextView
        android:id="@+id/aisle_order_entry"
        android:layout_width="@dimen/ailseorder_text_size"
        android:layout_height="@dimen/rowheight"
        android:textSize="@dimen/standard_listview_text_size"/>
    <!-- Aisle Shopref 4 debugging -->
    <TextView
        android:id="@+id/aisle_shopref_entry"
        android:layout_width="50sp"
        android:layout_height="@dimen/rowheight"
        android:textSize="@dimen/standard_listview_text_size"
        android:visibility="gone"/>
</LinearLayout>

這是獲取光標並設置列表視圖以使用適配器的代碼示例(同樣如上文所述),這將在您的活動中:-

    Cursor aislescsr = shopperdb.getAislesPerShopAsCursor(csr.getInt(ShopperDBHelper.SHOPS_COLUMNN_ID_INDEX));
    final ListView lv = (ListView) findViewById(R.id.aalbclv01);
    AislesCursorAdapter aisleadapter = new AislesCursorAdapter(lv.getContext(), aislescsr, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
    currentaca = aisleadapter;
    lv.setAdapter(aisleadapter);

第一行從數據庫填充游標。 第二行獲取將用數據庫中的數據填充的 ListView。 第三行設置適配器的光標。 第四行不相關。 第五行將適配器與 ListView 聯系起來。

有一個 SimpleCursorAdapter 但我從來沒有用過,所以不能真正告訴你它/它們。

此外,CursorAdapter 期望有一個名為 _id 的列,因此您可能必須使用 AS _id。

這是一個示例,我沒有 _id 並使用 AS 來設置它(請參閱第 3 行):-

        SQLiteDatabase db = this.getReadableDatabase();
        String sqlstr = " SELECT " + PRODUCTUSAGE_COLUMN_AISLEREF +
                " AS _id, " +
                PRODUCTUSAGE_COLUMN_PRODUCTREF + ", " +
                PRODUCTUSAGE_COLUMN_COST + ", " +
                PRODUCTUSAGE_COLUMN_BUYCOUNT + ", " +
                PRODUCTUSAGE_COLUMN_FIRSTBUYDATE + ", " +
                PRODUCTUSAGE_COLUMN_LATESTBUYDATE + ", " +
                PRODUCTUSAGE_COLUMN_MINCOST +
                " FROM " + PRODUCTUSAGE_TABLE_NAME +
                " ORDER BY _id;";
        return db.rawQuery(sqlstr, null);

數據庫類中像這樣的方法

    // Getting All User
public List<UserModel> getAllUser() {
    List<UserModel> userList = new ArrayList<UserModel>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_USER;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            UserModel user = new UserModel();
            user.setId(cursor.getString(0));
            user.setName(cursor.getString(1));
            user.setEmail(cursor.getString(2));
            // Adding user to list
            userList.add(user);
        } while (cursor.moveToNext());
    }

    // return user list
    return userList;
}

所以你調用這個方法,你會得到模型類的 List 類型

之后你只需要傳入適配器並實現它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM