跟着黑马视频学习所得,直接贴代码,两个MainActivity只是不同的listview样式显示。
package com.example.bhj;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView mListView=findViewById(R.id.list_view);
//得到数据库的数据
PersonDao dao = new PersonDao(this);
for (int i = 0;i<50;i++){
dao.insert(new Person(i,"陈子龙"+i,i));
}
personList = dao.queryAll();
//把view层对象ListView和控制器BaseAdapter关联起来
mListView.setAdapter(new MyAdapter());
}
/**
* 数据适配器
*/
class MyAdapter extends BaseAdapter{
@Override
/**
* 定义ListView的数据长度,也就是item的个数
*/
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
/**
* 返回ListView中指定某一行的view对象,也就是item对象
* @param position 当前view的索引位置
* @param convertView 缓存对象
* @param parent ListView
* @return
*/
public View getView(int position, View convertView, ViewGroup parent) {
TextView mTextView = null;
if (convertView != null){ //判断缓存对象是否null,不为null时已经缓存了对象
mTextView = (TextView) convertView;
}else { //等于null,说明第一次显示,新创建
mTextView = new TextView(MainActivity.this);
}
mTextView.setTextSize(20);
Person person = personList.get(position);//获得指定位置的数据,进行对TextView的绑定
mTextView.setText(person.toString());
return mTextView;
}
}
}
package com.example.bhj;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
public class MainActivity01 extends AppCompatActivity {
private List<Person> personList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView mListView=findViewById(R.id.list_view);
//得到数据库的数据
PersonDao dao = new PersonDao(this);
for (int i = 0;i<50;i++){
dao.insert(new Person(i,"陈子龙"+i,i));
}
personList = dao.queryAll();
//把view层对象ListView和控制器BaseAdapter关联起来
mListView.setAdapter(new MyAdapter());
}
/**
* 数据适配器
*/
class MyAdapter extends BaseAdapter{
@Override
/**
* 定义ListView的数据长度,也就是item的个数
*/
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
/**
* 返回ListView中指定某一行的view对象,也就是item对象
* @param position 当前view的索引位置
* @param convertView 缓存对象
* @param parent ListView
* @return
*/
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null){
//布局填充器对象,用于把xml对象转化为view对象
LayoutInflater inflater = MainActivity01.this.getLayoutInflater();
view = inflater.inflate(R.layout.listview_item,null);
}else {
view = convertView;
}
//给view中的年龄和姓名赋值
TextView tvName = view.findViewById(R.id.tv_listview_item_name);//这里需调用view中的findViewById,不然会在R.layout.activity_main中寻找
TextView tvAge = view.findViewById(R.id.tv_listview_item_age);
Person person = personList.get(position);
tvName.setText("姓名"+person.getName());
tvAge.setText("年龄"+person.getAge());
return view;
}
}
}
package com.example.bhj;
/**
* Created by bhj on 2018/9/15.
*
* Person的一个实体类
*/
public class Person {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.example.bhj;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
/**
* Created by bhj on 2018/9/15.
*/
/**
* SQLiteDatabase类概述
公开管理SQLite数据库的方法。
SQLiteDatabase有创建、删除、执行SQL命令和执行其他常见数据库管理任务的方法
*只有通过SQLiteOpenHelper类来得到SQLiteDatabase对象,得到这个对象来连接数据库
*
* 所以在PersonDao构造函数中把PersonSQLiteOpenHelper来初始化,得到他的一个对象
*/
public class PersonDao {
private PersonSQLiteOpenHelper mOpenHelper; // 数据库的帮助类对象
public PersonDao(Context context){
mOpenHelper = new PersonSQLiteOpenHelper(context);
}
/**
* 添加到person表一条数据
* @param person 传入person的一个实体类,里面定义了id,name,age
*/
public void insert(Person person){
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (db.isOpen()){ //如果数据库打开,执行添加的操作
db.execSQL("INSERT INTO person(name,age) values(?,?);",new Object[]{person.getName(),person.getAge()});
db.close();//关闭数据库
}
}
/**
* 更据id删除记录
* @param id
*/
public void delete(int id) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // 获得可写的数据库对象
if(db.isOpen()) { // 如果数据库打开, 执行添加的操作
db.execSQL("delete from person where id =?;", new Integer[]{id});
db.close(); // 数据库关闭
}
}
/**
* 根据id找到记录, 并且修改姓名
* @param id
* @param name
*/
public void update(int id, String name) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) { // 如果数据库打开, 执行添加的操作
db.execSQL("update person set name = ? where id = ?;", new Object[]{name, id});
db.close(); // 数据库关闭
}
}
/**
* 查询所有的数据
* @return person
*/
public List<Person> queryAll(){
SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象
if (db.isOpen()){
Cursor cursor = db.rawQuery("select id, name, age from person;", null);
if (cursor != null && cursor.getCount()>0){//如果游标读到的行有数据
List<Person> personList = new ArrayList<Person>();
int id;
String name;
int age;
while (cursor.moveToNext()){
id = cursor.getInt(0);//取第0列的数据 id 列是从0开始的,有数据的行第一行是1
name = cursor.getString(1);
age = cursor.getInt(2);
personList.add(new Person(id,name,age));
}
cursor.close();
db.close();
return personList;
}
db.close();
}
return null;
}
public Person queryItem(int id){
SQLiteDatabase db = mOpenHelper.getReadableDatabase();// 获得一个只读的数据库对象
if (db.isOpen()){
Cursor cursor = db.rawQuery("select id,name,age from person where id=? ;",new String[]{id+""});
if (cursor!=null&&cursor.moveToFirst()){
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
db.close();
return new Person(_id, name, age);
}
cursor.close();
db.close();
}
return null;
}
}
package com.example.bhj;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
/**
* Created by bhj on 2018/9/15.
*/
/**
* 借用API来操作数据库
*/
public class PersonDao2 {
private static final String TAG = "PersonDao2";
private PersonSQLiteOpenHelper mOpenHelper; // 数据库的帮助类对象
public PersonDao2(Context context) {
mOpenHelper = new PersonSQLiteOpenHelper(context);
}
/**
* 添加到person表一条数据
* @param person
*/
public void insert(Person person) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) { // 如果数据库打开, 执行添加的操作
ContentValues values = new ContentValues();
values.put("name", person.getName()); // key作为要存储的列名, value对象列的值
values.put("age", person.getAge());
long id = db.insert("person", "name", values);
Log.i(TAG, "id: " + id);
db.close(); // 数据库关闭
}
}
/**
* 更据id删除记录
* @param id
*/
public void delete(int id) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase(); // 获得可写的数据库对象
if(db.isOpen()) { // 如果数据库打开, 执行添加的操作
String whereClause = "_id = ?";
String[] whereArgs = {id + ""};
int count = db.delete("person", whereClause, whereArgs);
Log.i(TAG, "删除了: " + count + "行");
db.close(); // 数据库关闭
}
}
/**
* 根据id找到记录, 并且修改姓名
* @param id
* @param name
*/
public void update(int id, String name) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) { // 如果数据库打开, 执行添加的操作
ContentValues values = new ContentValues();
values.put("name", name);
int count = db.update("person", values, "id = ?", new String[]{id + ""});
Log.i(TAG, "修改了: " + count + "行");
db.close(); // 数据库关闭
}
}
public List<Person> queryAll() {
SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象
if(db.isOpen()) {
String[] columns = {"id", "name", "age"}; // 需要的列
String selection = null; // 选择条件, 给null查询所有
String[] selectionArgs = null; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值
String groupBy = null; // 分组语句 group by name
String having = null; // 过滤语句
String orderBy = null; // 排序
Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);
int id;
String name;
int age;
if(cursor != null && cursor.getCount() > 0) {
List<Person> personList = new ArrayList<Person>();
while(cursor.moveToNext()) { // 向下移一位, 知道最后一位, 不可以往下移动了, 停止.
id = cursor.getInt(0);
name = cursor.getString(1);
age = cursor.getInt(2);
personList.add(new Person(id, name, age));
}
db.close();
return personList;
}
cursor.close();
db.close();
}
return null;
}
/**
* 根据id查询人
* @param id
* @return
*/
public Person queryItem(int id) {
SQLiteDatabase db = mOpenHelper.getReadableDatabase(); // 获得一个只读的数据库对象
if(db.isOpen()) {
String[] columns = {"_id", "name", "age"}; // 需要的列
String selection = "_id = ?"; // 选择条件, 给null查询所有
String[] selectionArgs = {id + ""}; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值
String groupBy = null; // 分组语句 group by name
String having = null; // 过滤语句
String orderBy = null; // 排序
Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);
if(cursor != null && cursor.moveToFirst()) { // cursor对象不为null, 并且可以移动到第一行,默认是-1行
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
db.close();
return new Person(_id, name, age);
}
cursor.close();
db.close();
}
return null;
}
}
package com.example.bhj;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* 数据库帮助类,用于创建和管理数据库.
* Created by bhj on 2018/9/11.
*/
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
/**
* 数据库的构造方法
* @param context
* name 数据库名称
* factory 游标工程
* version 数据库版本,不能小于1
*/
public PersonSQLiteOpenHelper(Context context) {
super(context, "bhj.db", null, 2);
}
/**
* 数据库创建时回调此方法
* 初始化一些表格
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//操作数据库
String spl = "create table person(id integer primary key,name varchar(20),age integer);";
db.execSQL(spl);//生成一个名叫person的表
}
/**
* 数据库的版本号更新时回调此方法
* 更新数据库的内容(删除表,增加表,修改表)
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1 && newVersion == 2){
// 在person表中添加一个余额列balance
db.execSQL("alter table person add balance integer;");
}
}
}
activity_main.xml
<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:orientation="horizontal"
tools:context=".MainActivity">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
listview_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/src_01"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_listview_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="张三"/>
<TextView
android:id="@+id/tv_listview_item_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30dp"
android:text="35"/>
</LinearLayout>
</LinearLayout>