1 目标从sqllite中读取数据并显示如下:
MainActivity对应的界面
2 配置Android的清单文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima28.sqlitedemo" android:versionCode="1" android:versionName="1.0" >
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.itheima28.sqlitedemo"> </instrumentation>
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner"/>
<!-- 运行的时候改变 com.itheima28.sqlitedemo.MainActivity 或com.itheima28.sqlitedemo.MainActivity2来显示不同的界面 --> <activity android:name="com.itheima28.sqlitedemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
3 编写操作数据库用的工具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; }
} } |