android基础入门SQLite数据库操作(15)

来源:互联网 发布:cfd模拟软件 编辑:程序博客网 时间:2024/04/29 13:41

一.SQLite数据库:

     SQLite第一个 Alpha版本诞生于2000年5月,是一款轻型数据库,设计目的是嵌入式的,它占用的资源非常少,在嵌入式的设备中只需要几百KB就足够了,这也就是android系统使用SQLite的原因。

     SQLite数据库具有如下特征:

   1.轻量级:

   SQLite和C/S模式(Client/Server,客户机/服务器)的数据库软件不同,他是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上他的一个动态库,就可以使用他的全部功能,并且动态库也非常小。

   2.独立性:

   SQLite数据库的核心引擎本身不依赖第三方软件,使用他也不需要“安装”,所以在部署时能省去不少的麻烦。

   3.隔离性:

   SQLite数据库中的所有信息都包含在一个文件内,方便管理和维护。

   4.跨平台:

   SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统都可以运行,例如Android、Windows Mobile等。

   5.多语言接口:

   SQLite数据库支持很多语言编程接口,比如java、python、doNet等。

   6.安全性:

  SQLite数据库通过数据库级上的独占性和共享锁来实现独立事物处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据,在某个进程或线程向数据库执行写入操作之前,必须获得独占锁定,在发出独占锁定后,其他的读或写操作将不会再发生。

                                                        以上内容摘自<Android应用开发揭秘>杨丰盛 著。

二.SQLite操作:

    SQLite一般数据库操作:创建数据库、打开数据库、创建表、向表中添加数据、从表中删除数据、修改表中数据、关闭数据库、删除指定表、删除数据库和查询表中的莫条数据。

我一下内容都是由单元测试实现:

在使用android单元测试的时候一定要在清单文件中添加我的清单文件:

1.创建数据库(lzr.db)和表(person):

public class DBOpenHelper extends SQLiteOpenHelper {        //删除后面的三个参数,我们自己内部设定,以后条件改变在进行修改public DBOpenHelper(Context context) {//第二个参数 执行数据库的名称.第三个参数游标工厂我们传null表示使用系统默认的.//第四个参数我们表示为数据库版本号(大于0任何数都可以)。super(context, "lzr.db",null, 1); //数据库保存在<包>/database/}        //SQLiteDatabase中封装了数据库的所有操作。@Overridepublic void onCreate(SQLiteDatabase db) {//数据库第一次被创建的时候被调用// TODO Auto-generated method stub        db.execSQL("CREATE TABLE person(personid integer primary key autoincrement,name varchar(20),phone VARCHAR(12) NULL)");}    //此方法是在数据库的版本号发生变更的时候被调用。@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub     db.execSQL("ALTER TABLE person ADD amount integer");}}

这里我们继承SQLiteOpenHelper,当我们创建这个类的实例时,会创建数据库,我们调用父类的构造方法,就能创建出一个数据库,数据库的名称lzr.db,当数据库第一次被创建时,会自动的调用onCreate方法,我们在这个方法中一般放入的是表的创建语句。这里的数据库语句就是sql语句,我们设置personid为主键自动增长。

当我们修改了构造方法中的数据库版本号,这个版本号不能小于且等于零。


当我们第一次版本号为1的时候:

当修改了数据库版本号时,再次构造此类的对象则会触发onUpgrade()方法:


2.表的操作:

创建一个实体类:

public class Person {         private int id ;         private String name;         private String phone;         private Integer amount;         public Integer getAmount() {return amount;}public void setAmount(Integer amount) {this.amount = amount;}public Person(){}         public Person(String name) {this.name = name;}public Person(String name, String phone){this.name = name;this.phone = phone;}public Person(String name, String phone,Integer amount) {this.name = name;this.phone = phone;this.amount = amount;}public Person(int id, String name, String phone,Integer amount) {this.id = id;this.name = name;this.phone = phone;this.amount = amount;}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 String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn this.id+" "+this.name+" "+this.phone+"  "+this.amount;}               }

创建一个业务类:

public class PersonService {      private DBOpenHelper dbo;public PersonService(Context context){this.dbo  = new DBOpenHelper(context);}/** * 添加记录 * @param person */public void addPerson(Person person){SQLiteDatabase sql = dbo.getWritableDatabase();sql.execSQL("insert into person(name,phone,amount) values(?,?,?)",new Object[]{person.getName(),person.getPhone(),person.getAmount()});}/** * 删除记录 * @param id */public void deletePerson(Integer id){SQLiteDatabase sql = dbo.getWritableDatabase();sql.execSQL("delete from person where personid=?",new Object[]{id});}/** * 修改记录 * @param person */public void updatePerson(Person person){SQLiteDatabase sql = dbo.getWritableDatabase();sql.execSQL("update person set name=?,phone=?,amount=? where personid=?",new Object[]{person.getName(),person.getPhone(),person.getAmount(),person.getId()});}/** * 查找记录 * @param id * @return */public Person find(Integer id){SQLiteDatabase sql = dbo.getReadableDatabase();Cursor cu = sql.rawQuery("select * from person where personid=?", new String[]{id.toString()});if(cu.moveToFirst()){int personid = cu.getInt(cu.getColumnIndex("personid"));String name = cu.getString(cu.getColumnIndex("name"));String phone = cu.getString(cu.getColumnIndex("phone"));    int amount = cu.getInt(cu.getColumnIndex("amount"));return new Person(personid,name,phone,amount);}cu.close();return null;}/** * 分页获取记录 * @param offset 跳过前面多少条记录 * @param maxResult  每页获取多少条记录 * @return */public List<Person> getListPerson(int offset,int maxResult){List<Person> list = new ArrayList<Person>();SQLiteDatabase sql = dbo.getReadableDatabase();Cursor cu = sql.rawQuery("select * from person order by personid asc limit ?,?",new String[]{String.valueOf(offset),String.valueOf(maxResult)});while(cu.moveToNext()){int personid = cu.getInt(cu.getColumnIndex("personid"));String name = cu.getString(cu.getColumnIndex("name"));String phone = cu.getString(cu.getColumnIndex("phone"));int amount = cu.getInt(cu.getColumnIndex("amount"));System.out.println(name);list.add(new Person(personid,name,phone,amount));}cu.close();return list;}/** * 获取 * @return */public Long getCount(){SQLiteDatabase sql = dbo.getReadableDatabase();Cursor cu = sql.rawQuery("select count(*) from person ", null);cu.moveToFirst();long result = cu.getLong(0);cu.close();return result;}public void payment(){SQLiteDatabase sql = dbo.getWritableDatabase();sql.beginTransaction();//开启事务try{sql.execSQL("update person set amount=amount-10 where personid=3");sql.execSQL("update person set amount=amount+10 where personid=4");sql.setTransactionSuccessful();//设置事务的标志为true。}finally{sql.endTransaction();//结束事物,有两种情况:commit,rollback//事物的提交或回滚是由事物的标志决定,如果事务的标志为true,事务就会提交,否则回滚,默认情况下事务的标志为false。}}}


Cursor类常见方法:

1.move()     以当前位置为参考,将Cursor移动到指定的位置,成功返回true,失败返回false。

2.moveToPosition()       将Cursor移动到指定的位置,成功返回true,失败返回false。  

3.moveToNext()        将Cursor向前移动一个位置,成功返回true,失败返回false。

4.moveToLast()       将Cursor向后移动一个位置,成功返回true,失败返回false。

5.moveToFirst()     将Cursor移动到第一行,成功返回true,失败返回false。

6.isBeforeFirst()     返回Cursor是否指向第一项数据之前。

7.isAfterLast()      返回Cursor时候指向最后一项数据之后。

8.isClosed()     返回Cursor是否关闭

9.isFirst()      返回Cursor是否指向第一项数据

10.isLast()     返回Cursor是否指向最后一项数据

11.isNull()      返回指定位置的值是否为NULL.

12.getCount()         返回总的数据项数。

13.getInt()     返回当前行中指定索引的数据。


单元测试类:

public class DBTest extends AndroidTestCase {       public void testCreateDB() throws Exception{         DBOpenHelper d = new DBOpenHelper(getContext());                  d.getWritableDatabase();       }              public void testAddPerson() throws Exception{       PersonService per = new PersonService(this.getContext());       for(int i = 0; i < 15;i++){       Person  person = new Person("lisi"+i,"123132131",200+i);       per.addPerson(person);       }              }       public void testDelete() throws Exception{       PersonService per = new PersonService(this.getContext());       per.deletePerson(2);              }       public void testUpdate() throws Exception{       PersonService per = new PersonService(this.getContext());       Person  person = per.find(1);           person.setName("wangwu");           per.updatePerson(person);       }       public void testFind() throws Exception{       PersonService per = new PersonService(this.getContext());      Person person = per.find(1);      System.out.println(person.toString());              }       public void testListPerson() throws Exception{       PersonService per = new PersonService(this.getContext());       //从0开始每页五条记录       List<Person> list = per.getListPerson(0, 5);       for(Person person:list){       System.out.println(person);       }       }       public void testCount() throws Exception{       PersonService per = new PersonService(this.getContext());      long result = per.getCount();      System.out.println(result);              }       public void testPayment(){       PersonService per = new PersonService(this.getContext());       per.payment();       Person person = per.find(3);       Person person2 = per.find(4);       System.out.println(person.toString());       System.out.println(person2.toString());       }}


testAddPerson()运行后数据库:

testUpdate()方法运行图片:

testDelete()方法运行图片:

testFind()方法运行图片:

testPayment()方法运行图片:



当我们想在模拟器上显示出数据时,可以用ListView来显示所有的数据:

ListView绑定的布局(item.xml):

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="horizontal" >        <TextView        android:layout_width="90dp"        android:layout_height="wrap_content"        android:id="@+id/name"        />    <TextView        android:layout_width="140dp"        android:layout_height="wrap_content"        android:id="@+id/phone"        />    <TextView        android:layout_width="90dp"        android:layout_height="wrap_content"        android:id="@+id/amount"        /></LinearLayout>

主界面布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" ><LinearLayout    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:orientation="horizontal" >        <TextView        android:layout_width="90dp"        android:layout_height="wrap_content"        android:text="姓名"        />    <TextView        android:layout_width="140dp"        android:layout_height="wrap_content"        android:text="电话"        />    <TextView        android:layout_width="90dp"        android:layout_height="wrap_content"        android:text="存款"        /></LinearLayout>     <ListView         android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:id="@+id/listView"         />            </LinearLayout>

这里我们有需要适配器,自定义适配器(PersonAdapter.java):

public class PersonAdapter extends BaseAdapter {private List<Person>  persons ; //在绑定的数据private int resource;//绑定的条目界面private LayoutInflater inflater;public PersonAdapter(Context context ,List<Person> persons,int resource){this.persons = persons;this.resource = resource;inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}    //返回绑定数据长度@Overridepublic int getCount() {return persons.size();}@Overridepublic Object getItem(int arg0) {return persons.get(arg0);}@Overridepublic long getItemId(int arg0) {return arg0;}@Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) {TextView nameView = null;TextView phoneView = null;TextView amountView = null;if(arg1 == null){arg1 = inflater.inflate(resource, null); nameView = (TextView)arg1.findViewById(R.id.name); phoneView = (TextView)arg1.findViewById(R.id.phone); amountView = (TextView)arg1.findViewById(R.id.amount);ViewCache cache = new ViewCache();cache.nameView = nameView;cache.phoneView = phoneView;cache.amountView = amountView;    arg1.setTag(cache);}else{ViewCache vc = (ViewCache)arg1.getTag();nameView = vc.nameView;phoneView = vc.phoneView;amountView = vc.amountView;}Person person = persons.get(arg0);nameView.setText(person.getName());phoneView.setText(person.getPhone());amountView.setText(String.valueOf(person.getAmount()));return arg1;}public final class ViewCache{public TextView nameView;public TextView phoneView;public TextView amountView;}}

主代码:

public class MainActivity extends Activity {private ListView listview;private PersonService ps;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ps = new PersonService(this);listview = (ListView)findViewById(R.id.listView);listview.setOnItemClickListener(new ItemClickListener());show2();}private final class ItemClickListener implements OnItemClickListener{@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {               ListView lv = (ListView)arg0;           Person person = (Person)lv.getItemAtPosition(arg2);Toast.makeText(getApplicationContext(), String.valueOf(person.getId()), Toast.LENGTH_SHORT).show();}}   /** * 不使用自定义适配器显示效果。public void show(){List<Person>  list = ps.getListPerson(0, 17);List<HashMap<String,Object>>  data = new ArrayList<HashMap<String,Object>>();for(Person person : list){HashMap<String,Object> item = new HashMap<String, Object>();item.put("name", person.getName());item.put("phone",person.getPhone());item.put("amount",person.getAmount());item.put("id", person.getId());data.add(item);}SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item,new String[]{"name","phone","amount"},new int[]{R.id.name,R.id.phone,R.id.amount});listview.setAdapter(adapter);}**/public void show2(){List<Person> persons = ps.getListPerson(0, 17);PersonAdapter pa = new PersonAdapter(this,persons,R.layout.item);listview.setAdapter(pa);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}


运行界面:



 


3 0
原创粉丝点击