Android SQLite的使用,基本的增删改查效果,以及ListView的效果显示

 
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>

 

你可能感兴趣的:(android SQLite)