代码之家  ›  专栏  ›  技术社区  ›  major

在选项卡式活动中将sqlite数据库中的所有数据显示到listview中

  •  2
  • major  · 技术社区  · 7 年前

    作为android开发的新手,我已经在这个问题上纠结了几个星期了,现在已经很累了。

    在阅读了每一篇教程并阅读了我能找到的每一个问题和答案之后,我仍然不知道如何让Android Studio只获取我的SQLite数据库中的内容并将其内容粘贴到 listview . 我本以为会有 android:displayallfrom("myDB") 在XML文件中执行某种命令,只显示数据库中的所有内容,但看起来要复杂得多。

    基本上,我想做的是 显示我的数据库中的所有数据 ( Dogs.db )进入我的 列表视图 ( list_dogs )在我的选项卡视图的第一个选项卡中( Tab1 ).

    这是我的代码:

    Tab1.java

    package com.example.major.awoo;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class Tab1 extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.tab1, container, false);
            return rootView;
        }
    }
    

    tab1.xml

    <RelativeLayout 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/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.major.awoo.MainActivity">
    
        <ListView
            android:id="@+id/list_dogs"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:listSelector=""/>
    
    </RelativeLayout>
    

    DatabaseHelper。Java语言

    package com.example.major.awoo;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    public class DatabaseHelper extends SQLiteOpenHelper {
        public static final String DATABASE_NAME = "Dogs.db";
        public static final String TABLE_NAME = "dogs_table";
        public static final String COL_1 = "ID";
        public static final String COL_2 = "NAME";
        public static final String COL_3 = "AGE";
        public static final String COL_4 = "WEIGHT";
        public static final String COL_5 = "BREED";
    
        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, 1);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
                db.execSQL("create table " + TABLE_NAME +" (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,SURNAME TEXT,MARKS INTEGER)");
        }
    
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
            onCreate(db);
        }
    
        public boolean insertData(String name,String age,String weight,String breed) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues contentValues = new ContentValues();
            contentValues.put(COL_2,name);
            contentValues.put(COL_3,age);
            contentValues.put(COL_4,weight);
            contentValues.put(COL_5,breed);
            long result = db.insert(TABLE_NAME, null, contentValues);
            if(result == -1)
                return false;
            else
                return true;
        }
    
        public Cursor getAllData() {
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
            return res;
        }
    
        public boolean updateData(String id,String name,String age,String weight,String breed) {
            SQLiteDatabase db = this.getWritableDatabase();
            ContentValues contentValues = new ContentValues();
            contentValues.put(COL_1,id);
            contentValues.put(COL_2,name);
            contentValues.put(COL_3,age);
            contentValues.put(COL_4,weight);
            contentValues.put(COL_5,breed);
            db.update(TABLE_NAME, contentValues, "ID = ?",new String[] { id });
            return true;
        }
    
        public Integer deleteData (String id) {
            SQLiteDatabase db = this.getWritableDatabase();
            return db.delete(TABLE_NAME, "ID = ?",new String[] {id});
    
        }
    
        public Cursor getListContents(){
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
            return data;
    }
    
    //method to display data
    
        public Cursor displayData;
        {
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor res = db.rawQuery(" SELECT  * FROM " + TABLE_NAME, null);
            return res;    
        }   
    
    }
    

    我确信我错过了一些非常愚蠢的事情,但如果有任何帮助,我将不胜感激。

    1 回复  |  直到 7 年前
        1
  •  8
  •   Yousaf    6 年前

    如果你想显示每个人的每一个信息 dog 在一个 ListView ,您需要 Dog 班虽然这不是必需的,但它会使您的工作更轻松,而且从数据库中获取数据并存储每个 在一个 类实例。

    public class Dog {
        private String id;
        private String name;
        private String age;
        private String breed;
        private String weight;
    
        public Dog(String id, String name, String age, String breed, String weight) {
            this.id = id;
            this.name = name;
            this.age = age;
            this.breed = breed;
            this.weight = weight;
        }
    
        public String getID() {
            return this.id;
        }
    
        public String getName() {
            return this.name;
        }
    
        public String getAge() {
            return this.age;
        }
    
        public String getWeight() {
            return this.weight;
        }
    
        public String getBreed() {
            return this.breed;
        }
    }
    

    然后需要定义 layout XML 将表示 列表视图 . 您可以按照自己的方式进行设计。

    这是一个 实例 行布局代码

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <TextView
            android:id="@+id/text_dogID"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="demo"
            android:textColor="#000"
            android:textSize="25sp"/>
    
        <TextView
            android:id="@+id/text_dogName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="demo"
            android:textColor="#000"
            android:textSize="25sp"
            app:layout_constraintTop_toBottomOf="@id/text_dogID"/>
    
        <TextView
            android:id="@+id/text_dogAge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="demo"
            android:textColor="#000"
            android:textSize="25sp"
            app:layout_constraintTop_toBottomOf="@id/text_dogName"/>
    
        <TextView
            android:id="@+id/text_dogWeight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="demo"
            android:textColor="#000"
            android:textSize="25sp"
            app:layout_constraintTop_toBottomOf="@id/text_dogAge"/>
    
        <TextView
            android:id="@+id/text_dogBreed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="demo"
            android:textColor="#000"
            android:textSize="25sp"
            app:layout_constraintTop_toBottomOf="@id/text_dogWeight"/>
    
    </android.support.constraint.ConstraintLayout>
    

    之后,你需要自己的 custom adapter 将其分类 extends 这个 BaseAdapter 类别和 Override 这个 getView 方法

    这是一个 实例 自定义适配器类

    public class CustomAdapter extends BaseAdapter{
    
        private ArrayList<Dog> dogsList;
        private Context context;
    
        public CustomAdapter(ArrayList<Dog> list, Context cont){
            this.dogsList = list;
            this.context = cont;
        }
    
        @Override
        public int getCount() {
            return this.dogsList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return this.dogsList.get(position);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
    
            if(convertView == null){
                LayoutInflater inf = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inf.inflate(R.layout.listview_row_layout, null);
    
                holder = new ViewHolder();
                holder.id = (TextView)convertView.findViewById(R.id.text_dogID);
                holder.name = (TextView)convertView.findViewById(R.id.text_dogName);
                holder.age = (TextView)convertView.findViewById(R.id.text_dogAge);
                holder.weight = (TextView)convertView.findViewById(R.id.text_dogWeight);
                holder.breed = (TextView)convertView.findViewById(R.id.text_dogBreed);
    
                convertView.setTag(holder);
            }
            else {
                holder = (ViewHolder)convertView.getTag();
            }
    
            Dog stu = dogsList.get(position);
            holder.id.setText(stu.getID());
            holder.name.setText(stu.getName());
            holder.age.setText(stu.getAge());
            holder.weight.setText(stu.getWeight());
            holder.breed.setText(stu.getBreed());
    
            return convertView;
        }
    
        private static class ViewHolder{
            public TextView id;
            public TextView name;
            public TextView age;
            public TextView weight;
            public TextView breed;
        }
    }
    

    现在,您需要从数据库中获取数据,并将每只狗的信息存储在单独的 前面创建的类实例。

    public ArrayList<Dog> getAllData() {
            ArrayList<Dog> doglist = new ArrayList<>();
            SQLiteDatabase db = this.getWritableDatabase();
            Cursor res = db.rawQuery("select * from "+TABLE_NAME,null);
    
            while(res.moveToNext()) {
                String id = res.getString(0);   //0 is the number of id column in your database table
                String name = res.getString(1);
                String age = res.getString(2);
                String breed = res.getString(3);
                String weight = res.getString(4);
    
                Dog newDog = new Dog(id, name, age, breed, weight);
                doglist.add(newDog);
            }
            return doglist;
     }
    

    现在,数据库中的所有数据都存储在 存储在中的类 doglist ArrayList .

    最后,您需要一种方法来填充 列表视图

    public void fillListview() {
         ListView myListview = findViewById(R.id.myListview);
         DatabaseHelper dbhelper = new DatabaseHelper(this);
    
         ArrayList<Dog> dogList = dbhelper.getAllData();
    
         Customadapter myAdapter = new Customadapter(dogList, this);
         myListview.setAdapter(myAdapter);
    }