代码改变世界

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>
View Code


给出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>
View Code

完成一个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>