Android SQLite的使用,基本的增删改查效果,以及ListView的效果显示
2014-05-01 22:11 低调的小码农 阅读(1685) 评论(0) 编辑 收藏 举报
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>