1 package com.example.sqlitetest;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import android.content.ContentValues;
6 import android.content.Context;
7 import android.database.Cursor;
8 import android.database.sqlite.SQLiteDatabase;
9
/**
*Dao层的编写,提供增删改查,查询全部等功能
*/
10 public class PersonDao {
11 private MyHelper helper;
12
13 public PersonDao(Context context) {
14 helper = new MyHelper(context);
15 }
16
17 /**
18 * 新增数据
19 *
20 * @param p
21 */
22 public void insert(Person p) {
23 SQLiteDatabase db = helper.getWritableDatabase();
24 db.execSQL("INSERT INTO person(name, balance) VALUES(?,?)",
25 new Object[] { p.getName(), p.getBalance() });
26 db.close();
27 }
28
29 /**
30 * 根据Id删除数据
31 *
32 * @param id
33 */
34 public void delete(int id) {
35 SQLiteDatabase db = helper.getWritableDatabase();
36 db.execSQL("DELETE FROM person WHERE id=?", new Object[] { id });
37 db.close();
38 }
39
40 /**
41 * 更新数据
42 *
43 * @param p
44 * @return
45 */
46 public void update(Person p) {
47 SQLiteDatabase db = helper.getWritableDatabase();
48 ContentValues values = new ContentValues();
49 values.put("name", p.getName());
50 values.put("balance", p.getBalance());
51 db.update("person", values, "id=?", new String[] { p.getId() + "" });
52 db.close();
53 }
54
55 /**
56 * 根据Id查询出一条数据
57 *
58 * @param id
59 * @return
60 */
61 public Person query(int id) {
62 SQLiteDatabase db = helper.getReadableDatabase();
63 Cursor c = db.query("person", new String[] { "name", "balance" },
64 "id=?", new String[] { id + "" }, null, null, null);
65 Person p = null;
66 if (c.moveToNext()) {
67 p = new Person();
68 p.setId(id);
69 p.setName(c.getString(c.getColumnIndex("name"))); // 获取name列的索引,
70 // 获取指定索引上的字符串数据,
71 // 设置为name属性
72 p.setBalance(c.getInt(1)); // 直接获取1号索引列上的数据, 设置为balance属性
73 }
74 c.close();
75 db.close();
76 return p;
77 }
78
79 /**
80 * 查询所有数据,返回一个List集合
81 *
82 * @return
83 */
84 public List<Person> queryAll() {
85 SQLiteDatabase db = helper.getReadableDatabase();
86 Cursor c = db.query("person", null, null, null, null, null, null);
87 List<Person> persons = new ArrayList<Person>();
88 while (c.moveToNext()) {
89 Person p = new Person();
90 p.setId(c.getInt(0));
91 p.setName(c.getString(1));
92 p.setBalance(c.getInt(2));
93 persons.add(p);
94 }
95 c.close();
96 db.close();
97 return persons;
98 }
99
100 }
1/**
*创建一个类实现SQLiteOpenHelper类,该对象用于建立于数据库的连接
2 */
3 import android.content.Context;
4 import android.database.sqlite.SQLiteDatabase;
5 import android.database.sqlite.SQLiteOpenHelper;
6
7 public class MyHelper extends SQLiteOpenHelper {
8
9 /**
10 * 创建工具对象, 该对象可以用来打开一个数据库连接
11 * @param context 当前应用的上下文环境对象
12 * @param name 数据库文件的名字
13 * @param factory 游标工厂, 填null就是默认工厂
14 * @param version 数据库版本号(从1开始)
15 * 当项目运行时候会检测version版本号有没有改变,若是改变了,则会走onUpgrade方法更新数据库,诺是 版本没有改变,诺数据库不存在则创建数据库,诺存在两个方法都不执行
*/
16 public MyHelper(Context context) {
17 super(context, "lucy.db", null, 1);
18 }
19
20 @Override
21 public void onCreate(SQLiteDatabase db) { // 数据库创建时执行
22 System.out.println("onCreate");
23 db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))"); // 创建表的代码
24 }
25
26 @Override
27 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级时执行
28 System.out.println("onUpgrade");
29 db.execSQL("ALTER TABLE person ADD balance INTEGER"); // 修改表的代码
30 }
31
32 }
1 /**
2 *创建测试类,用来测试dao层的增删改查方法,Android的测试类需要继承AndroidTestCase类,该类即为一个测试类,需要注意的是在AndroidMainfest.xml文件中需要引入一下配置,
*后面会列出ui界面的xml文件
<uses-library android:name="android.test.runner" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.sqlitetest" />
*/
3 import java.util.List;
4 import java.util.Random;
5
6 import android.test.AndroidTestCase;
7
8 public class SQLiteTest extends AndroidTestCase {
9
10 // 测试方法执行时: 把apk上传到手机 -> 安装 -> 创建SQLiteTest对象 -> 调用setContext()方法设置进来一个Context对象
11
12 public void testCreateDatabase() {
13 MyHelper helper = new MyHelper(getContext()); // 类似Activity类中的getApplicationContext()
14 helper.getWritableDatabase(); // 获取一个可写的数据库
15 /*
16 * 1.数据库不存在: 创建数据库, 执行onCreate()
17 * 2.数据库存在, 版本没变: 找到之前的数据库文件, 打开
18 * 3.数据库存在, 版本改变: 找到之前数据库文件, 打开, onUpgrade()
19 */
20 }
21 /**
22 * 一次性插入100條數據
23 */
24 public void testInsert() {
25 PersonDao dao = new PersonDao(getContext());
26 for (int i = 0; i < 100; i++)
27 dao.insert(new Person("Test" + i, new Random().nextInt(10000)));
28 }
29 /**
30 * 删除id是1的数据
31 */
32 public void testDelete() {
33 PersonDao dao = new PersonDao(getContext());
34 dao.delete(1);
35 }
36 /**
37 * 更新id是2的数据
38 */
39 public void testUpdate() {
40 PersonDao dao = new PersonDao(getContext());
41 dao.update(new Person(2, "小洺", 1000000));
42 }
43 /**
44 * 查询id是1,2,3的数据
45 */
46 public void testQuery() {
47 PersonDao dao = new PersonDao(getContext());
48 System.out.println(dao.query(1));
49 System.out.println(dao.query(2));
50 System.out.println(dao.query(3));
51 }
52 /**
53 * 查询所有的数据
54 */
55 public void testQueryAll() {
56 PersonDao dao = new PersonDao(getContext());
57 List<Person> persons = dao.queryAll();
58 for (Person person : persons) {
59 System.out.println(person);
60 }
61 }
62 }
1 package com.example.sqlitetest;
2 //实体类Person的编写,对该类进行Crud的操作
3 public class Person {
4 @Override
5 public String toString() {
6 return "Person [id=" + id + ", name=" + name + ", balance=" + balance
7 + "]";
8 }
9
10 private Integer id;
11
12 public Person(String name, Integer balance) {
13 super();
14 this.name = name;
15 this.balance = balance;
16 }
17
18 public Person() {
19 // TODO Auto-generated constructor stub
20 }
21
22 private String name;
23 private Integer balance;
24
25 public Integer getId() {
26 return id;
27 }
28
29 public void setId(Integer id) {
30 this.id = id;
31 }
32
33 public String getName() {
34 return name;
35 }
36
37 public void setName(String name) {
38 this.name = name;
39 }
40
41 public Integer getBalance() {
42 return balance;
43 }
44
45 public void setBalance(Integer balance) {
46 this.balance = balance;
47 }
48 }
以上即可完成一个简单的sqlite数据库的增删改查的功能测试。
下面是将Sqlite中的数据以ListView模式进行
1 package com.example.sqlitetest;
2
3 import java.util.List;
4 import android.app.Activity;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.view.ViewGroup;
8 import android.widget.BaseAdapter;
9 import android.widget.ListView;
10 import android.widget.TextView;
11
12 public class MainActivity extends Activity {
13 private List<Person> persons;
14 private PersonDao dao;
15
16 public void onCreate(Bundle savedInstanceState) {
17 super.onCreate(savedInstanceState);
18 dao = new PersonDao(getApplicationContext());
19 persons = dao.queryAll();
20 System.err.println("<><><><><><><>><>="+persons.size());
21 ListView personLV = (ListView) findViewById(R.id.personLV);
22 personLV.setAdapter(new MyBaseAdapter()); //给ListView设置适配器,适配器会自动生成条目添加到ListView中去
23 //
24 }
25 //编写自定义的Adapter继承BaseAdapter,拿到一个适配器
26 private class MyBaseAdapter extends BaseAdapter {
27 public int getCount() { // 获取条目总数
28 return persons.size();
29 }
30
31 public Object getItem(int position) { // 获取指定位置上的数据
32 return persons.get(position);
33 }
34
35 public long getItemId(int position) { // 获取条目的Id
36 return position;
37 }
38
39 public View getView(int position, View convertView, ViewGroup parent) { // 获取指定位置上的View根据Person的对象创建一个View,
40 // 鏍规嵁Person瀵硅薄鍒涘缓涓?釜View杩斿洖
41 View view = convertView == null ? View.inflate(
42 getApplicationContext(), R.layout.item, null) : convertView; // 根据布局文件生成一个View
43 TextView idTV = (TextView) view.findViewById(R.id.idTV); // 使用view获取TextView,不要再activity中找,匿名内部类了
44
45 TextView nameTV = (TextView) view.findViewById(R.id.nameTV);
46 TextView balanceTV = (TextView) view.findViewById(R.id.balanceTV);
47
48 Person p = persons.get(position); // 获取指定位置撒谎那个的Person 对象
49 idTV.setText(p.getId() + ""); // 给TextView 替换文本,不用要些int 类型的否则会去查找R文件的数据
50 // 鍚﹀垯浼氭煡R鏂囦欢
51 nameTV.setText(p.getName());
52 balanceTV.setText(p.getBalance() + "");
53
54 return view;
55 }
56 }
57 }
给出Item 的ui模版 ,一个线性布局里面放置三个TextView分别存放id name blanace
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="horizontal"
6 android:padding="10dp" >
7
8 <TextView
9 android:id="@+id/idTV"
10 android:layout_width="0dp"
11 android:layout_height="wrap_content"
12 android:layout_weight="1"
13 android:text="15"
14 android:textSize="30sp" />
15
16 <TextView
17 android:id="@+id/nameTV"
18 android:layout_width="0dp"
19 android:layout_height="wrap_content"
20 android:layout_weight="2"
21 android:singleLine="true"
22 android:text="姓名"
23 android:textSize="30sp" />
24
25 <TextView
26 android:id="@+id/balanceTV"
27 android:layout_width="0dp"
28 android:layout_height="wrap_content"
29 android:layout_weight="2"
30 android:text="1234"
31 android:textSize="30sp" />
32
33 </LinearLayout>
给出main.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <LinearLayout
8 android:background="#555555"
9 android:layout_width="match_parent"
10 android:layout_height="wrap_content"
11 android:orientation="horizontal"
12 android:padding="10dp" >
13
14 <TextView
15 android:id="@+id/idTV"
16 android:layout_width="0dp"
17 android:layout_height="wrap_content"
18 android:layout_weight="1"
19 android:text="ID"
20 android:textSize="30sp" />
21
22 <TextView
23 android:id="@+id/nameTV"
24 android:layout_width="0dp"
25 android:layout_height="wrap_content"
26 android:layout_weight="2"
27 android:text="Name"
28 android:textSize="30sp" />
29
30 <TextView
31 android:id="@+id/balanceTV"
32 android:layout_width="0dp"
33 android:layout_height="wrap_content"
34 android:layout_weight="2"
35 android:text="Balance"
36 android:textSize="30sp" />
37
38 </LinearLayout>
39
40 <ListView
41 android:id="@+id/personLV"
42 android:layout_width="fill_parent"
43 android:layout_height="fill_parent" >
44 </ListView>
45
46 </LinearLayout>
完成一个ListView布局的demo
编写测试用例的时候需要注意的
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sqlitetest"
android:versionCode="1"
android:versionName="1.0" ><uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.sqlitetest" /> <!--
编写AndroidTestCase 测试类时需要有该节点配置
--><application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner" /> <!--
编写AndroidTestCase 测试类时需要有该节点配置
--><activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application></manifest>
Android SQLite的使用,基本的增删改查效果,以及ListView的效果显示,布布扣,bubuko.com