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. Do a web framework ourselves

    step 1: from wsgiref.simple_server import make_server def application(environ, start_response): star ...

  2. Rails中rspec测试xxx_path调用失败的解决

    首先要想生成类似于home_path,about_path之类的方法,必须在路由文件中添加对应方法: match '/help',to:"static_pages#help",vi ...

  3. iOS-改变UITextField的Placeholder颜色的三种方式

    转自:http://blog.csdn.net/mazy_ma/article/details/51775670 有时,UITextField自带的Placeholder的颜色太浅或者不满足需求,所以 ...

  4. 【SSH系列】静态代理&&动态代理

    从设计模式说起 代理模式是二十三中设计模式中的一种,代理模式就是指由一个代理主题来操作真实的主题,真实的主题执行具体的业务操作,而代理主题负责其她相关业务,简而言之,代理模式可以由以下三个部分组成: ...

  5. Android图表库MPAndroidChart(六)——换一种思考方式,水平条形图的实现过程

    Android图表库MPAndroidChart(六)--换一种思考方式,水平条形图的实现过程 一.基本实现 我们之前实现了条形图,现在来看下水平条形图是怎么实现的,说白了就是横起来,看下效果: 说起 ...

  6. 【安卓开发】用PageTransformer打造更好的动画效果

    Android的ViewPager类已经变成一个相当流行的Android应用组件了.它简单直观,并且提供了极好的功能.你可以经常在设置向导,图片画廊种看到它,它还是分开应用内容的良好方式. 标准的Vi ...

  7. 分享一个CUDA的环境配置属性表,从此不用再担心配置不好CUDA环境了

    本文适用: Visual Studio 2008,C++, CUDA版本不限,不过我用的是5.5做的实验. 先贴出属性表的内容: <?xml version="1.0" en ...

  8. 1.httpClient和ScrollView

    1 在服务器端使用sqllite编写数据库 常见命令是:sqlite3 tank.db 进入之后创建表: create table tscore ( id integer primary key au ...

  9. Linux之dmesg命令

    功能说明:显示内核缓冲区系统控制信息的工具 ,比如系统在启动时的信息会写到/var/log/中.语 法:dmesg [-cn][-s <缓冲区大小>] 补充说明:kernel会将开机信息存 ...

  10. Git 解决一个电脑多用户情况(win7)

    首先:在输入ssh-keygen -t rsa -C "注册邮箱"后不要急着按enter,此时输入秘钥对的文件名,不要跟默认文件重名(默认的是id_rsa) 划红线的地方就是新的文 ...