I,安卓下的数据库
安卓下使用的数据库是SQLite,安卓为我们提供的API是SQLiteOpenHelper。
1,创建一个数据库
1)写一类去继承抽象类SQLiteOpenHelper,我们需要复写相关的方法:
1 public WcxSQLite(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version); 3 } 4 5 public void onCreate(SQLiteDatabase db) { 6 7 } 8 9 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 10 11 }
对于这些参数Context context, String name, CursorFactory factory,int versioncontext表示的是上下文,name则是创建数据库的名字,factory表示游标工厂,当为null的时候,表示使用默认的游标工厂,version顾名思义表示的是数据库的版本。 对于onCreate方法,代表的是数据库创建时,就会调用的方法,所以我们可以在方法里去写一些初始化的动作。而onUpgrade方法,只有当数据库的版本发生变化时,才会调用。 下面我们在onCreate方法中,进行一些初始化的操作,比如创建出表结构:
1 public void onCreate(SQLiteDatabase db) { 2 /** 3 * 安卓下的SQLite是移动平台的嵌入式数据库,实际上所定义的类型,如(int varchar),真正在底层存放的时候都是以String字符来存放的。 4 * varchar(20)和varchar(10)没有任何区别! 5 */ 6 db.execSQL("create table person(id int primary key auto_increment,name varchar(20),number varchar(20))"); 7 }
II,实现增删改查(普通的方式)
我们可以写一个操作数据库的dao,在构造方法中就创建数据库。如:
1 private PersonSQLiteOpenHelper helper; 2 public PersonDao(Context context){ 3 /** 4 * 在构造方法中实现数据库的初始化 5 */ 6 helper=new PersonSQLiteOpenHelper(context); 7 }
其实创建数据库相关类的对象,并没有实际的在硬盘上创建一个数据库文件,就如同File一样,我们需要调用它的读和写的方法,才算真正的创建数据库。
1)增加数据到数据库:
建议采用db.execSQL(sql, bindArgs)方法,因为这个方法可以防止SQL注入,不容易写错。该方法并没有返回值,所以我们无法得知是否添加成功
2)查询数据库
对于查询使用的是rawQuery(String sql, String[] selectionArgs)方法,它返回的是游标Cursor,对于一张表,游标最初位于表的第一行的前面,如图:
画红线的就是游标最先指向的行,调用它的movenext方法,游标就一行一行的往下移动。
3)删除,更改数据库
同样没有返回值,使用普通方式来操作数据库的弊端已经显现。
4)查询所有
附上代码:
1 /** 2 *查询所有的数据。把查询到的数据添加到javabea中,再存放在集合中,在返回集合 3 */ 4 public List<Person> findAll(){ 5 SQLiteDatabase db=helper.getWritableDatabase(); 6 Cursor cursor=db.rawQuery("select * from person", null); 7 List<Person> list=new ArrayList<Person>(); 8 while(cursor.moveToNext()){ 9 /** 10 * id为第一列 11 */ 12 int id=cursor.getInt(cursor.getColumnIndex("id")); 13 /** 14 * 而name和number为第二列和第三列 15 */ 16 String name=cursor.getString(cursor.getColumnIndex("name")); 17 String number=cursor.getString(cursor.getColumnIndex("number")); 18 Person person=new Person(id, name, number); 19 /** 20 * 添加到集合 21 */ 22 list.add(person); 23 } 24 return list; 25 }
先把数据库的数据查询出来,封装到数据库。接着添加到集合,然后在测试方法中,遍历集合,就可以查询所有的数据。
III,增删改查(andorid的方式)
对于普通方式操作数据,我认为最大的缺点就是没有返回值,即使我没操作成功,也不会有什么提示,而使用安卓的方式,几乎解决了这一困扰。
1)增加数据
使用的是db.insert(table, nullColumnHack, values)方法。
table指的就是要往哪张表去插入数据,
nullColumnHack表示的当你为它指定值后,当没有成功插入数据时,就会默认的为你插入null到表中,所以当我们不需要这样的功能时,就把它设置为null。
values类型是ContextValues,可以把它理解为map,添加键值对,键代表列名,值代表列所对应的值。
public long add(String name,String number){ SQLiteDatabase db=helper.getWritableDatabase(); ContentValues values=new ContentValues(); values.put(name, number); long id=db.insert("person",null, values); db.close(); return id; }
insert方法是有返回值的,返回的是新添加行的id,如果没有添加成功,就会返回-1.所以我们可以根据返回值来判断是否添加成功。
2)查询数据
对于查询数据,我只说它的方法:
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
table:插入的表名
columns:查询哪些列
selection, selectionArgs:where语句和where语句对应的值
groupBy, having, orderBy:是否分组,是否过滤,是否排序,不管的话,写为null即可。
3)修改和删除数据
db.update(table, values, whereClause, whereArgs)
db.delete(table, whereClause, whereArgs)
它们的返回值是影响到的行数,如果没有成功,返回的是0
IV,一个小技巧
当我们写好了数据库后,可以写一个测试类来测试是否操作成功。安卓中写测试类,不仅需要继承AndroidTestCase类,还需要在清单文件去配置。
如果我们忘记了怎么去配置,可以新建一个测试工程,去它的清单文件去拷贝。