1 目标从sqllite中读取数据并显示如下:

MainActivity对应的界面

MainActivity2对应的界面          

2  配置Android的清单文件

<?xml   编写操作数据库用的工具PersonSQLiteOpenHelper

package com.itheima28.sqlitedemo.db;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.util.Log;

/**

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

* @author toto

*/

public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {

private static final String TAG = "PersonSQLiteOpenHelper";

/**

* 数据库的构造函数

* @param context

*

* name 数据库名称

* factory 游标工程

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

*/

public PersonSQLiteOpenHelper(Context context) {

//Open Declaration android.database.sqlite.SQLiteOpenHelper.SQLiteOpenHelper(

//                                         Context context,

//                                         String name,

//                                         CursorFactory factory,

//                                         int version)

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

}

/**

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

* 初始化

*/

@Override

public void onCreate(SQLiteDatabase db) {

//操作数据库

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

db.execSQL(sql);

}

/**

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

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

*/

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

}

}

}

4 编写Person实体

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

}

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 + "]";

}

}

5第一种直接通过sql的方式操作数据库:

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

}

}

/**

* 查询所有

* @return

*/

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

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;

}

/**

* 根据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);

cursor.close();

db.close();

return new Person(_id, name, age);

}

db.close();

}

return null;

}

}

6 第二种操作数据库的方式

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;

/**

* 不使用SQL的方式进行操作

* @author toto

*/

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

//key作为要存储的列名,value对象列的值

values.put("name", person.getName());

values.put("age", person.getAge());

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

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

//数据库关闭

db.close();

}

}

/**

* 根据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();

}

}

/**

* 查询所有的结果集

* @return

*/

public List<Person> queryAll() {

// 获得一个只读的数据库对象

SQLiteDatabase db = mOpenHelper.getReadableDatabase();

if(db.isOpen()) {

// 需要的列

String[] columns = {"_id", "name", "age"};

// 选择条件, 给null查询所有

String selection = null;

// 选择条件的参数, 会把选择条件中的? 替换成数据中的值

String[] selectionArgs = null;

// 分组语句  group by name

String groupBy = null;

// 过滤语句

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

}

cursor.close();

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"};

// 选择条件, 给null查询所有

String selection = "_id = ?";

// 选择条件的参数, 会把选择条件中的? 替换成数据中的值

String[] selectionArgs = {id + ""};

// 分组语句  group by name

String groupBy = null;

// 过滤语句

String having = null;

// 排序

String orderBy = null;

Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

// cursor对且象不为null, 并可以移动到第一行

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

int _id = cursor.getInt(0);

String name = cursor.getString(1);

int age = cursor.getInt(2);

cursor.close();

db.close();

return new Person(_id, name, age);

}

db.close();

}

return null;

}

}

7 TestCase才是personDao,注意项目中是通过单元测试来添加数据的

package com.itheima28.sqlitedemo.test;

import java.util.List;

import android.database.sqlite.SQLiteDatabase;

import android.test.AndroidTestCase;

import android.util.Log;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

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

List<Person> personList = 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();

}

}

}

数据库截图如下:

8 TestCase2测试第二种方式操作数据库

package com.itheima28.sqlitedemo.test;

import java.util.List;

import com.itheima28.sqlitedemo.dao.PersonDao2;

import com.itheima28.sqlitedemo.db.PersonSQLiteOpenHelper;

import com.itheima28.sqlitedemo.entities.Person;

import android.test.AndroidTestCase;

import android.util.Log;

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

List<Person> personList = 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());

}

}

9 MainActivity的代码如下:

package com.itheima28.sqlitedemo;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ListView;

import android.widget.TextView;

import com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

public class MainActivity extends Activity {

private List<Person> personList;

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

}

}

}

10 MainActivity2的代码如下:

package com.itheima28.sqlitedemo;

import java.util.List;

import android.app.Activity;

import android.os.Bundle;

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 com.itheima28.sqlitedemo.dao.PersonDao;

import com.itheima28.sqlitedemo.entities.Person;

public class MainActivity2 extends Activity {

private List<Person> personList;

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

}

}

}

07_Android操作sqllite数据库(包括2中方式操作数据的方式),单元测试,BaseAdapter的使用,自定义view的综合使用案例的更多相关文章

  1. JDBC操作Oracle数据库——实际操作过程中的小总结

    1.对数据库中,表的每一行数据记录的增删改查 增:insert into 表名 values() 删:delete 表名 where 条件(id=?) 改:update 表名 set 列名=? whe ...

  2. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

  3. 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...

  4. Android中API建议的方式实现SQLite数据库的增、删、改、查的操作

    package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android. ...

  5. UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

    在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...

  6. 不使用spring的情况下原生java代码两种方式操作mongodb数据库

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  7. 不使用spring的情况下用java原生代码操作mongodb数据库的两种方式

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  8. C# Asp.net中简单操作MongoDB数据库(一)

    需要引用MongoDB.Driver.dll.MongoDB.Driver.core.dll.MongoDB.Bson.dll三个dll. 1.数据库连接: public class MongoDb ...

  9. Android中操作SQLite数据库

    我又回到了安卓的学习当中,忙来忙去终于忙的差不多有时间做自己的事情了,这感觉实在是太棒了!!本来想写android的控件以及他们的监视器的,但是我查了查android的手册,基本上都能查到,但是查有些 ...

随机推荐

  1. Oracle中查询和删除相同记录的3种方法

    --创建测试表 )); ,'); ,'); ,'); ,'); ,'); ,'); commit; select * from test; --查询相同记录 ); select id,name fro ...

  2. ACM Max Factor

    To improve the organization of his farm, Farmer John labels each of his N (1 <= N <= 5,000) co ...

  3. Ubuntu 16.04 + ROS Kinetic 机器人操作系统学习镜像分享与使用安装说明

    Ubuntu 16.04 + ROS Kinetic 镜像分享与使用安装说明 内容概要:1 网盘文件介绍  2 镜像制作  3 系统使用与安装 ---- 祝ROS爱好者和开发者新年快乐:-) ---- ...

  4. 理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存 ...

  5. Studio 一些使用

    1,配置: W:\android_tools\AndroidStudio2.1.3_SDK\android-studio-ide-141.2456560-windows\android-studio\ ...

  6. 值集&快速编码(Lookup_code)

    --值集 SELECT ffv.flex_value, ffv.description   FROM fnd_flex_values_vl ffv, fnd_flex_value_sets ffs   ...

  7. [linux RedHat]windows下使用putty远程连接linux 下载JDK和tomcat

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/43154543 本文作者:sushengmiyan ------------------ ...

  8. 分布式内存文件系统Tachyon

    UCBerkeley研发的Tachyon(超光子['tækiːˌɒn],名字要不要这么太嚣张啊:)是一款为各种集群并发计算框架提供内存数据管理的平台,也可以说是一种内存式的文件系统吧.如下图,它就处于 ...

  9. 关于Lt分发系统的时序图分析

    我们已经知道,系统共分为两个模块,mather与son 同时系统允许的操作也有三种,向mather提交war包,我某个服务器更新代码,为所有服务器更新代码 我们一个一个来看 先说,向mather提交w ...

  10. Android 四种常见的线程池

    引入线程池的好处 1)提升性能.创建和消耗对象费时费CPU资源 2)防止内存过度消耗.控制活动线程的数量,防止并发线程过多. 我们来看一下线程池的简单的构造 public ThreadPoolExec ...