作为一个初来乍到android开发我一直停留在这个问题上的几个星期现在它变得相当累人。
看着每一个教程,并阅读每一个问题和答案,我能找到后,我仍然无法弄清楚如何让Android Studio中只取什么在我的SQLite数据库和它的内容粘贴到listview
。我想象会有某种形式的XML文件只是显示一切都存在一个数据库的android:displayallfrom("myDB")
命令,但它似乎要复杂得多。
基本上,我想要做的是显示从我的数据库(Dogs.db
)所有数据到我在我的标签视图(listview
)的第一个选项卡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>
database helper.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;
}
}
我敢肯定有一些非常愚蠢的我失踪,但任何帮助,将不胜感激。
如果你想在一个dog
显示每个ListView
的每一个信息,你需要做一个Dog
类。虽然这是没有必要的,但它会使您的工作更轻松,它会更有意义,从数据库中获取数据,并存储每个dog
的一个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
文件,将代表您ListView
的每一行。您可以到任何你想要的方式设计它。
这里有一个例子排布局代码
<?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;
}
}
现在,你需要从数据库中获取的数据和每只狗的信息存储在您之前创建一个单独的Dog
类的实例。
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;
}
现在,数据库中的所有数据存储在存储在Dog
doglist
ArrayList
类的实例。
最后,您需要填充您的ListView
的方法
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);
}