android增删改查listview,【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创...

数据库的创建和sql语句增删改查

20160407093359587.png

1. 加载驱动.

2. 连接数据库.

3. 操作数据库.

创建表:

create table person(

_id integer primary key,

name varchar(20),

age integer

);

添加: insert into person(name, age) values('lisi', 19);

删除: delete from person where _id = 1;

修改: update person set name = '李四' where name = '王五';

查询所有: select * from person;

查询单条: select * from person where name = 'zhangsan';

SQLiteExpert3, pc上的工具软件。

package com.itheima28.sqlitedemo.dao;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class PersonDao {

private PersonSQLiteOpenHelper mOpenHelper;// 数据库的帮助类对象

public PersonDao(Context context) {

mOpenHelper = new PersonSQLiteOpenHelper(context);

}

/**

* 添加到person表一条数据

* @param person

*/

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();// 数据库关闭

}

}

public ListqueryAll() {

SQLiteDatabase db = mOpenHelper.getReadableDatabase();// 获得一个只读的数据库对象

if(db.isOpen()) {

Cursor cursor = db.rawQuery("select _id, name, age from person;", null);

if(cursor != null && cursor.getCount() > 0) {

ListpersonList = new ArrayList();

int id;

String name;

int age;

while(cursor.moveToNext()) {

id = cursor.getInt(0);// 取第0列的数据 id

name = cursor.getString(1);// 取姓名

age = cursor.getInt(2);// 取年龄

personList.add(new Person(id, name, age));

}

db.close();

return personList;

}

db.close();

}

return null;

}

/**

* 根据id查询人

* @param id

* @return

*/

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);

}

db.close();

}

return null;

}

}

package com.itheima28.sqlitedemo.db;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

/**

* @author andong

* 数据库帮助类, 用于创建和管理数据库的.

*/

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {

private static final String TAG = "PersonSQLiteOpenHelper";

/**

* 数据库的构造函数

* @param context

*

* name 数据库名称

* factory 游标工程

* version 数据库的版本号 不可以小于1

*/

public PersonSQLiteOpenHelper(Context context) {

super(context, "itheima28.db", null, 2);

}

/**

* 数据库第一次创建时回调此方法.

* 初始化一些表

*/

@Override

public void onCreate(SQLiteDatabase db) {

// 操作数据库

String sql = "create table person(_id integer primary key, name varchar(20), age integer);";

db.execSQL(sql);// 创建person表

}

/**

* 数据库的版本号更新时回调此方法,

* 更新数据库的内容(删除表, 添加表, 修改表)

*/

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

if(oldVersion == 1 && newVersion == 2) {

Log.i(TAG, "数据库更新啦");

// 在person表中添加一个余额列balance

db.execSQL("alter table person add balance integer;");

}

}

}

package com.itheima28.sqlitedemo.entities;

public class Person {

private int id;

private String name;

private int age;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Person() {

super();

// TODO Auto-generated constructor stub

}

public Person(int id, String name, int age) {

super();

this.id = id;

this.name = name;

this.age = age;

}

@Override

public String toString() {

return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";

}

}

package com.itheima28.sqlitedemo.test;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.test.AndroidTestCase;

import android.util.Log;

public class TestCase extends AndroidTestCase {

private static final String TAG = "TestCase";

public void test() {

// 数据库什么时候创建

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

// 第一次连接数据库时创建数据库文件. onCreate会被调用

openHelper.getReadableDatabase();

}

public void testInsert() {

PersonDao dao = new PersonDao(getContext());

dao.insert(new Person(0, "冠希", 28));

}

public void testDelete() {

PersonDao dao = new PersonDao(getContext());

dao.delete(1);

}

public void testUpdate() {

PersonDao dao = new PersonDao(getContext());

dao.update(3, "凤姐");

}

public void testQueryAll() {

PersonDao dao = new PersonDao(getContext());

ListpersonList = dao.queryAll();

for (Person person : personList) {

Log.i(TAG, person.toString());

}

}

public void testQueryItem() {

PersonDao dao = new PersonDao(getContext());

Person person = dao.queryItem(4);

Log.i(TAG, person.toString());

}

public void testTransaction() {

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

SQLiteDatabase db = openHelper.getWritableDatabase();

if(db.isOpen()) {

try {

// 开启事务

db.beginTransaction();

// 1. 从张三账户中扣1000块钱

db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan';");

// ATM机, 挂掉了.

// int result = 10 / 0;

// 2. 向李四账户中加1000块钱

db.execSQL("update person set balance = balance + 1000 where name = 'lisi';");

// 标记事务成功

db.setTransactionSuccessful();

} finally {

// 停止事务

db.endTransaction();

}

db.close();

}

}

public void testTransactionInsert() {

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

SQLiteDatabase db = openHelper.getWritableDatabase();

if(db.isOpen()) {

// 1. 记住当前的时间

long start = System.currentTimeMillis();

// 2. 开始添加数据

try {

db.beginTransaction();

for (int i = 0; i < 10000; i++) {

db.execSQL("insert into person(name, age, balance) values('wang" + i + "', " + (10 + i) + ", " + (10000 + i) + ")");

}

db.setTransactionSuccessful();

} finally {

db.endTransaction();

}

// 3. 记住结束时间, 计算耗时时间

long end = System.currentTimeMillis();

long diff = end - start;

Log.i(TAG, "耗时: " + diff + "毫秒");

db.close();

}

}

}

使用api方式查询数据库和sqlite3工具

20160407093359588.png

adb shell

2834_0.png

package com.itheima28.sqlitedemo.dao;

import java.util.ArrayList;

import java.util.List;

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.util.Log;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

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 ListqueryAll() {

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) {

ListpersonList = new ArrayList();

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;

}

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, 并且可以移动到第一行

int _id = cursor.getInt(0);

String name = cursor.getString(1);

int age = cursor.getInt(2);

db.close();

return new Person(_id, name, age);

}

db.close();

}

return null;

}

}

package com.itheima28.sqlitedemo.test;

import java.util.List;

import android.test.AndroidTestCase;

import android.util.Log;

import com.itheima28.sqlitedemo.dao.PersonDao2;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

public class TestCase2 extends AndroidTestCase {

private static final String TAG = "TestCase";

public void test() {

// 数据库什么时候创建

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

// 第一次连接数据库时创建数据库文件. onCreate会被调用

openHelper.getReadableDatabase();

}

public void testInsert() {

PersonDao2 dao = new PersonDao2(getContext());

dao.insert(new Person(0, "zhouqi", 88));

}

public void testDelete() {

PersonDao2 dao = new PersonDao2(getContext());

dao.delete(8);

}

public void testUpdate() {

PersonDao2 dao = new PersonDao2(getContext());

dao.update(3, "fengjie");

}

public void testQueryAll() {

PersonDao2 dao = new PersonDao2(getContext());

ListpersonList = dao.queryAll();

for (Person person : personList) {

Log.i(TAG, person.toString());

}

}

public void testQueryItem() {

PersonDao2 dao = new PersonDao2(getContext());

Person person = dao.queryItem(4);

Log.i(TAG, person.toString());

}

}

事务的操作

事务:

update person set balance = balance - 100 where name = 'lisi';

update person set balance = balance + 100 where name = 'zhangsan';

// 开启事务

db.beginTransaction();

// 标记事务成功

db.setTransactionSuccessful();

// 停止事务

db.endTransaction();

public void testTransaction() {

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

SQLiteDatabase db = openHelper.getWritableDatabase();

if(db.isOpen()) {

try {

// 开启事务

db.beginTransaction();

// 1. 从张三账户中扣1000块钱

db.execSQL("update person set balance = balance - 1000 where name = 'zhangsan';");

// ATM机, 挂掉了.

// int result = 10 / 0;

// 2. 向李四账户中加1000块钱

db.execSQL("update person set balance = balance + 1000 where name = 'lisi';");

// 标记事务成功

db.setTransactionSuccessful();

} finally {

// 停止事务

db.endTransaction();

}

db.close();

}

}

public void testTransactionInsert() {

PersonSQLiteOpenHelper openHelper = new PersonSQLiteOpenHelper(getContext());

SQLiteDatabase db = openHelper.getWritableDatabase();

if(db.isOpen()) {

// 1. 记住当前的时间

long start = System.currentTimeMillis();

// 2. 开始添加数据

try {

db.beginTransaction();

for (int i = 0; i < 10000; i++) {

db.execSQL("insert into person(name, age, balance) values('wang" + i + "', " + (10 + i) + ", " + (10000 + i) + ")");

}

db.setTransactionSuccessful();

} finally {

db.endTransaction();

}

// 3. 记住结束时间, 计算耗时时间

long end = System.currentTimeMillis();

long diff = end - start;

Log.i(TAG, "耗时: " + diff + "毫秒");

db.close();

}

}

LinearLayout展示列表数据

package com.itheima28.sqlitedemo;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.LinearLayout;

import android.widget.TextView;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

LinearLayout llList = (LinearLayout) findViewById(R.id.ll_list);

PersonDao dao = new PersonDao(this);

ListpersonList = dao.queryAll();

if(personList != null) {

TextView tv;

for (Person person : personList) {

// 向线性布局中添加一个textview

tv = new TextView(this);

tv.setText(person.toString());

tv.setTextSize(18);

llList.addView(tv);

}

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

ListView的使用和BaseAdater

package com.itheima28.sqlitedemo;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.Menu;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.TextView;

public class MainActivity extends Activity {

private ListpersonList;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ListView mListView = (ListView) findViewById(R.id.listview);

PersonDao dao = new PersonDao(this);

personList = dao.queryAll();

// 把view层对象ListView和控制器BaseAdapter关联起来

mListView.setAdapter(new MyAdapter());

}

/**

* @author andong

* 数据适配器

*/

class MyAdapter extends BaseAdapter {

private static final String TAG = "MyAdapter";

/**

* 定义ListView的数据的长度

*/

@Override

public int getCount() {

return personList.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return null;

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return 0;

}

/**

* 此方法返回的是ListView的列表中某一行的View对象

* position 当前返回的view的索引位置

* convertView 缓存对象

* parent 就是ListView对象

*/

@Override

public View getView(int position, View convertView, ViewGroup parent) {

TextView tv = null;

if(convertView != null) {// 判断缓存对象是否为null, 不为null时已经缓存了对象

Log.i(TAG, "getView: 复用缓存" + position);

tv = (TextView) convertView;

} else {// 等于null, 说明第一次显示, 新创建

Log.i(TAG, "getView: 新建" + position);

tv = new TextView(MainActivity.this);

}

tv.setTextSize(25);

Person person = personList.get(position); // 获得指定位置的数据, 进行对TextView的绑定

tv.setText(person.toString());

return tv;

}

}

}

package com.itheima28.sqlitedemo;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

import android.os.Bundle;

import android.app.Activity;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.ListView;

import android.widget.TextView;

public class MainActivity2 extends Activity {

private ListpersonList;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ListView mListView = (ListView) findViewById(R.id.listview);

PersonDao dao = new PersonDao(this);

personList = dao.queryAll();

// 把view层对象ListView和控制器BaseAdapter关联起来

mListView.setAdapter(new MyAdapter());

}

/**

* @author andong

* 数据适配器

*/

class MyAdapter extends BaseAdapter {

private static final String TAG = "MyAdapter";

/**

* 定义ListView的数据的长度

*/

@Override

public int getCount() {

return personList.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return null;

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return 0;

}

/**

* 此方法返回的是ListView的列表中某一行的View对象

* position 当前返回的view的索引位置

* convertView 缓存对象

* parent 就是ListView对象

*/

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view = null;

if(convertView == null) {

// 布局填充器对象, 用于把xml布局转换成view对象

LayoutInflater inflater = MainActivity2.this.getLayoutInflater();

view = inflater.inflate(R.layout.listview_item, null);

} else {

view = convertView;

}

// 给view中的姓名和年龄赋值

TextView tvName = (TextView) view.findViewById(R.id.tv_listview_item_name);

TextView tvAge = (TextView) view.findViewById(R.id.tv_listview_item_age);

Person person = personList.get(position);

tvName.setText("姓名: " + person.getName());

tvAge.setText("年龄: " + person.getAge());

return view;

}

}

}

listview_item.xml

其他两种绑定ListView数据的方式

listview_item.xml

package com.itheima28.simpleadapterdemo;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ListView mListView = (ListView) findViewById(R.id.listview);

List> data = new ArrayList>();

Map map = new HashMap();

map.put("name", "张三1");

map.put("icon", R.drawable.f007);

data.add(map);

map = new HashMap();

map.put("name", "张三2");

map.put("icon", R.drawable.f007);

data.add(map);

map = new HashMap();

map.put("name", "张三3");

map.put("icon", R.drawable.f007);

data.add(map);

map = new HashMap();

map.put("name", "张三4");

map.put("icon", R.drawable.f007);

data.add(map);

map = new HashMap();

map.put("name", "张三5");

map.put("icon", R.drawable.f007);

data.add(map);

SimpleAdapter adapter = new SimpleAdapter(

this, // 上下文

data, // listView绑定的数据

R.layout.listview_item, // listview的子条目的布局的id

new String[]{"name", "icon"}, // data数据中的map集合里的key

new int[]{R.id.tv_name, R.id.iv_icon}); // resource 中的id

mListView.setAdapter(adapter);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

内容提供者创建

20160407093400591.png

package com.itheima28.sqlitedemo.providers;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.net.Uri;

public class PersonContentProvider extends ContentProvider {

private static final String AUTHORITY = "com.itheima28.sqlitedemo.providers.PersonContentProvider";

private static final int PRESON_INSERT_CODE = 0;// 操作person表添加的操作的uri匹配码

private static final int PERSON_DELETE_CODE = 1;

private static final int PERSON_UPDATE_CODE = 2;

private static final int PERSON_QUERY_ALL_CODE = 3;

private static final int PERSON_QUERY_ITEM_CODE = 4;

private static UriMatcher uriMatcher;

private PersonSQLiteOpenHelper mOpenHelper;// person表的数据库帮助对象

static {

uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

// 添加一些uri(分机号)

// content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/insert

uriMatcher.addURI(AUTHORITY, "person/insert", PRESON_INSERT_CODE);

// content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/delete

uriMatcher.addURI(AUTHORITY, "person/delete", PERSON_DELETE_CODE);

// content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/update

uriMatcher.addURI(AUTHORITY, "person/update", PERSON_UPDATE_CODE);

// content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/queryAll

uriMatcher.addURI(AUTHORITY, "person/queryAll", PERSON_QUERY_ALL_CODE);

// content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/#

uriMatcher.addURI(AUTHORITY, "person/query/#", PERSON_QUERY_ITEM_CODE);

}

@Override

public boolean onCreate() {

mOpenHelper = new PersonSQLiteOpenHelper(getContext());

return true;

}

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

SQLiteDatabase db = mOpenHelper.getReadableDatabase();

switch (uriMatcher.match(uri)) {

case PERSON_QUERY_ALL_CODE: // 查询所有人的uri

if(db.isOpen()) {

Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);

return cursor;

// db.close(); 返回cursor结果集时, 不可以关闭数据库

}

break;

case PERSON_QUERY_ITEM_CODE:// 查询的是单条数据, uri末尾出有一个id

if(db.isOpen()) {

long id = ContentUris.parseId(uri);

Cursor cursor = db.query("person", projection, "_id = ?", new String[]{id + ""}, null, null, sortOrder);

return cursor;

}

break;

default:

throw new IllegalArgumentException("uri不匹配: " + uri);

}

return null;

}

@Override

public String getType(Uri uri) {

switch (uriMatcher.match(uri)) {

case PERSON_QUERY_ALL_CODE: // 返回多条的MIME-type

return "vnd.android.cursor.dir/person";

case PERSON_QUERY_ITEM_CODE: // 返回单条的MIME-TYPE

return "vnd.android.cursor.item/person";

default:

break;

}

return null;

}

@Override

public Uri insert(Uri uri, ContentValues values) {

switch (uriMatcher.match(uri)) {

case PRESON_INSERT_CODE:// 添加人到person表中

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

if(db.isOpen()) {

long id = db.insert("person", null, values);

db.close();

return ContentUris.withAppendedId(uri, id);

}

break;

default:

throw new IllegalArgumentException("uri不匹配: " + uri);

}

return null;

}

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

switch (uriMatcher.match(uri)) {

case PERSON_DELETE_CODE:// 在person表中删除数据的操作

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

if(db.isOpen()) {

int count = db.delete("person", selection, selectionArgs);

db.close();

return count;

}

break;

default:

throw new IllegalArgumentException("uri不匹配: " + uri);

}

return 0;

}

@Override

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {

switch (uriMatcher.match(uri)) {

case PERSON_UPDATE_CODE: // 更新person表的操作

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

if(db.isOpen()) {

int count = db.update("person", values, selection, selectionArgs);

db.close();

return count;

}

break;

default:

throw new IllegalArgumentException("uri不匹配: " + uri);

}

return 0;

}

}

内容提供者访问和权限

20160407093400593.png

package com.itheima28.othercontentprovider;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.test.AndroidTestCase;

import android.util.Log;

public class TextCase extends AndroidTestCase {

private static final String TAG = "TextCase";

public void testInsert() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/insert");

// 内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

ContentValues values = new ContentValues();

values.put("name", "fengjie");

values.put("age", 90);

uri = resolver.insert(uri, values);

Log.i(TAG, "uri: " + uri);

long id = ContentUris.parseId(uri);

Log.i(TAG, "添加到: " + id);

}

public void testDelete() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/delete");

// 内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

String where = "_id = ?";

String[] selectionArgs = {"21"};

int count = resolver.delete(uri, where, selectionArgs);

Log.i(TAG, "删除行: " + count);

}

public void testUpdate() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/update");

// 内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

ContentValues values = new ContentValues();

values.put("name", "lisi");

int count = resolver.update(uri, values, "_id = ?", new String[]{"20"});

Log.i(TAG, "更新行: " + count);

}

public void testQueryAll() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/queryAll");

// 内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

Cursor cursor = resolver.query(uri, new String[]{"_id", "name", "age"}, null, null, "_id desc");

if(cursor != null && cursor.getCount() > 0) {

int id;

String name;

int age;

while(cursor.moveToNext()) {

id = cursor.getInt(0);

name = cursor.getString(1);

age = cursor.getInt(2);

Log.i(TAG, "id: " + id + ", name: " + name + ", age: " + age);

}

cursor.close();

}

}

public void testQuerySingleItem() {

Uri uri = Uri.parse("content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/#");

// 在uri的末尾添加一个id content://com.itheima28.sqlitedemo.providers.PersonContentProvider/person/query/20

uri = ContentUris.withAppendedId(uri, 20);

// 内容提供者访问对象

ContentResolver resolver = getContext().getContentResolver();

Cursor cursor = resolver.query(uri, new String[]{"_id", "name", "age"}, null, null, null);

if(cursor != null && cursor.moveToFirst()) {

int id = cursor.getInt(0);

String name = cursor.getString(1);

int age = cursor.getInt(2);

cursor.close();

Log.i(TAG, "id: " + id + ", name: " + name + ", age: " + age);

}

}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android中的ListView是一种常用的控件,用于展示列表数据。对于ListView增删改查操作,可以通过以下方式实现: 1. 增加数据:可以通过Adapter的add()方法向ListView中添加数据,也可以通过修改数据源并调用Adapter的notifyDataSetChanged()方法来更新ListView。 2. 删除数据:可以通过Adapter的remove()方法从ListView中删除数据,也可以通过修改数据源并调用Adapter的notifyDataSetChanged()方法来更新ListView。 3. 修改数据:可以通过修改数据源并调用Adapter的notifyDataSetChanged()方法来更新ListView。 4. 查询数据:可以通过Adapter的getItem()方法获取ListView中的数据,也可以通过遍历数据源来获取数据。 总之,对于ListView增删改查操作,关键在于对数据源的管理和Adapter使用。通过合理的数据源管理和Adapter使用,可以轻松实现ListView增删改查操作。 ### 回答2: Android中的ListView控件是一种非常常见的列表控件。它可以用来展示大量的数据,比如联系人列表、新闻列表、商品列表等。在ListView中进行增删改查操作是非常常见的需求。 增加操作: 要在ListView中增加一个新的项,首先需要根据具体的需求创建一个数据模型对象。然后将该对象添加到显示该列表Adapter中。一般的步骤如下: 1.准备好数据模型对象; 2.获得Adapter对象; 3.调用Adapter的add()方法,将数据项添加到Adapter对象中。 删除操作: 在ListView中删除一个项非常简单,一般的步骤是: 1.找到需要删除的数据项; 2.从Adapter中移除该数据项; 3.刷新ListView。 下面是一个示例: adapter.remove(item); adapter.notifyDataSetChanged(); 修改操作: 要在ListView中修改一个数据项,首先需要获取需要修改的数据项,并对其进行修改,然后通知Adapter更新数据项,并刷新ListView。具体步骤如下: 1.获得Adapter对象; 2.修改需要修改的数据项; 3.通知Adapter更新数据,并刷新ListView。 下面是一个示例: Adapter.getItem(position).setXXX(newValue); adapter.notifyDataSetChanged(); 查询操作: 在ListView中进行查询非常简单,只需要根据具体需求在Adapter中查询数据,并将查询结果展示ListView中即可。具体步骤如下: 1.根据需要查询的条件遍历Adapter中的数据项; 2.将符合条件的数据项保存到一个新的数据结构中,通常是一个List; 3.创建一个新的Adapter对象,将查询结果展示在其中,并将新的Adapter对象与ListView绑定。 下面是一个示例: List<Item> newItems = new ArrayList<>(); for (Item item : adapter.getItems()) { if (item.getXXX().equals(condition)) { newItems.add(item); } } ListView newListView = new ListView(this); newListView.setAdapter(new MyAdapter(newItems)); setContentView(newListView); ### 回答3: 在Android中,ListView是一种非常常用的控件,用于显示数据列表。在实际开发中,我们经常需要对ListView进行数据增删改查操作。 1、增加数据ListView中增加数据,首先需要获取ListView的适配器(Adapter),然后通过适配器的add()方法来添加数据。具体代码如下: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,dataList); listView.setAdapter(adapter); adapter.add("new data"); 2、删除数据ListView中删除数据,也需要先获取ListView的适配器,然后通过适配器的remove()方法来删除数据。具体代码如下: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,dataList); listView.setAdapter(adapter); adapter.remove("data to remove"); 3、修改数据ListView中修改数据,需要先获取ListView的适配器,然后通过适配器的getItem()方法获取要修改的数据,对其进行修改,最后再调用适配器的notifyDataSetChanged()方法进行刷新。具体代码如下: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,dataList); listView.setAdapter(adapter); String data = (String)adapter.getItem(1); data = "modified data"; adapter.notifyDataSetChanged(); 4、查询数据ListView中查询数据,可以通过适配器的getItem()方法或者通过ListView的getItemAtPosition()方法来获取。具体代码如下: ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,dataList); listView.setAdapter(adapter); String data = (String)adapter.getItem(1); String data2 = (String)listView.getItemAtPosition(1); 以上就是Android中对ListView进行增删改查操作的方法,通过这些方法,可以方便地对ListView进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值