标签:
停更了一天,I‘m back again~~当我们需要操作大量的数据时,我们首先想到的当然是数据库,因为可以通过简单的语句实现数据的增删改查,在Android中,我们不使用SQL或者ORACLE,我们使用SQLite,因为它占用资源更少,而语句格式与SQL语句一样。
首先,我们来在Android中实现数据库的创建与增删改查,引用数据库的类时,不再继承常用的Activity类,而是继承Android中的SQLiteOpenHelper,创建一个构造方法,四个参数分别是(Context context, String name, SQLiteDatabase.CursorFactory factory,int version),下面我们来分别解释一下这四个参数,context代表上下文环境,大多情况是上下文环境就是activity,name是数据库的名字,通常我们写成"xxx.db",这样方便知道我们创建的是一个数据库,cursor代表指针,在默认为null时,它表示初始为-1,然后依次指向数据库的每一行,我们可以利用cursor来扫描数据库,有条件的扫描就是查找,version代表版本号,只要设置大于等于1的值即可。在数据库类中一定要调用两个方法,即onCreate()与onUpdate()方法,传进来的参数都是数据库对象,它们分别在数据库被创建与数据库被更新时调用,在数据库被创建时创建表,直接调用执行数据库语句方法execSQL(String),代码如下:
package com.administrator.sqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.provider.Settings; /** * Created by Administrator on 2016/7/22. */ public class MyOpenHelper extends SQLiteOpenHelper { //构造方法,new时会调用,cursor:封装数据库查询时返回的数据,初始为-1.依次向下读取下一行数据,null使用默认游标 public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){ super(context,name,factory,version); } //数据库创建时,此方法会调用 //创建数据库的同时创建表 @Override public void onCreate(SQLiteDatabase db) { String sql="create table student(number char(4) primary key,name char(4),age char(1))"; db.execSQL(sql); } //数据库升级时,此方法会调用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("数据库被升级了"); } }
下面我们用单元测试方法来实现一下数据库的增删改查,写在ApplicationTest中,首先我们定义一个MyOpenHelper的对象,此时我们在测试,没有任何前台任务,所以此时没有正在执行的Activity,Android为我们提供了getContext()方法,用来在没有上下文环境中为我们创建一个虚拟的上下文环境。接下来我们调用getReadableDatabase()来创建或打开一个数据库(如果没有,我们就创建一个数据库,如果有,我们就打开这个数据库),对数据的增删改操作,就是创建好一个数据库后执行相应的SQL语句,最后关闭数据库。代码如下:
package com.administrator.sqlite; import android.app.Application; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.test.ApplicationTestCase; /** * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> */ public class ApplicationTest extends ApplicationTestCase<Application> { public ApplicationTest() { super(Application.class); } public void testInsert(){ MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); SQLiteDatabase db=moh.getReadableDatabase(); db.execSQL("insert into student values(?,?,?)",new Object[]{"1234","Lily","19"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1235","Bob","20"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1236","Amy","18"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1237","Tom","21"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1238","Alice","18"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1239","Grace","20"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1240","Henry","23"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1241","David","40"}); db.execSQL("insert into student values(?,?,?)",new Object[]{"1242","Soada","17"}); db.close(); } public void testDelete(){ MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); SQLiteDatabase db=moh.getReadableDatabase(); db.execSQL("delete from student where number=?",new Object[]{1241}); db.close(); } public void testUpdate(){ MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); SQLiteDatabase db=moh.getReadableDatabase(); db.execSQL("update student set number=? where name=?",new Object[]{"1314","Soada"}); db.close(); } }
对于对数据库的查找操作,我们需要利用游标实现按行扫描一遍数据库,并取出符合要求的数据,我们调用rawQuery方法,第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符(也就是where语句),该参数可以设置为null,返回一个游标Cursor。扫描方法是:如果游标指向的下一行不为空,就获取每行每个属性的值,从而实现多行扫描并得到整个数据库的数据。我们还要强调一下getString()方法传递的参数是一个整型的索引值,它代表该属性的索引值,第一个为0,以此类推;但我们在不明确数据库结构的情况下,很难知道确切的值,因此我们通常调用getColumnIndex方法。代码如下:
1 public void testSelect(){ 2 MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2); 3 SQLiteDatabase db=moh.getReadableDatabase(); 4 Cursor cursor=db.rawQuery("select * from student",null); 5 while(cursor.moveToNext()){ 6 //获取下一行数据 7 String number = cursor.getString(cursor.getColumnIndex("number")); 8 String name = cursor.getString(cursor.getColumnIndex("name")); 9 String age = cursor.getString(cursor.getColumnIndex("age")); 10 System.out.println(number+";"+name+";"+age); 11 db.close(); 12 }
下面我们来逐一测试一下:
增加若干条数据进入数据库student:
删除一条记录:删除number为1241的记录
修改一条记录:Soada的number改为1314
我们掌握了在Android中使用SQLite对数据的增删改查,下节我们要实现的是将数据库的每条记录依次显示到屏幕上。
标签:
原文地址:http://www.cnblogs.com/soada/p/5699491.html