上一篇在这:Github开源框架:ActiveAndroid (一)
创建我们自己的数据库模型
创建我们自己的数据库模型是很简单的,只要创建一个有注释域的类,并把它命名为我们要用的名字就可以了。但是有两件事情我们必须要注意:一、你的类必须是Model类的子类,并且使用@Column进行注释。ActiveAndroid 会处理类内的基本数据类型以及和其他表间的关系或者是日期类。二、ActiveAndroid 会在你的表中自动创建一个ID字段。这个字段会自动地递增。
ActiveAndroid将使用类内标准的构造函数去实例化对象。如果你定义了自己的构造函数,你必须再定义一个无参构造函数。源码中有注释能帮助你完成这项工作。
@Table(name = "Items") public class Item extends Model { // If name is omitted, then the field name is used. @Column(name = "Name") public String name; @Column(name = "Category") public Category category; public Item() { super(); } public Item(String name, Category category) { super(); this.name = name; this.category = category; } }在前面的叙述中,我们使用了 Categories 和 Items 来作为例子。其中Items是Categories里的其中一个,Categories里包含许多Items。那么我们在ActiveAndroid里要如何表示这两者的关系呢? 在Items类里,我们可以通过直接创建一个Category类对象,使两者有一个直接的关系。
@Table(name = "Items") public class Item extends Model { @Column(name = "Name") public String name; @Column(name = "Category") public Category category; }同样,Categories类可以表明它与许多项目的关系。我们这样做是因为有一个helper的方法。
@Table(name = "Categories") public class Category extends Model { @Column(name = "Name") public String name; // This method is optional, does not affect the foreign key creation. public List<Item> items() { return getMany(Item.class, "Category"); } }此外,你可以通过在列定义的注释中通过设置 index = true 对特定的列设置索引。这样会在两列中都创建一个表:
@Column(name = "Name", index = true) public String name; @Column(name = "Category", index = true) public String category;接下来讲一讲怎么加快程序的启动吧:
ActiveAndroid会翻阅你的所有文件去找到你的Model类。这个过程可能会很慢,如果你有许多的依赖库。为了加快这一进程,你可以在AndroidManifest.xml中显式地指定你的Model类:
<meta-data android:name="AA_MODELS" android:value="com.myapp.model.Item, com.myapp.model.Category" />最后,ActiveAndroid有一些列名是不可以用的,大家使用的时候最好注意一下:
ABORT DEFAULT INNER REGEXP
ACTION DEFERRABLE INSERT REINDEX
ADD DEFERRED INSTEAD RELEASE
AFTER DELETE INTERSECT RENAME
ALL DESC INTO REPLACE
ALTER DETACH IS RESTRICT
ANALYZE DISTINCT ISNULL RIGHT
AND DROP JOIN ROLLBACK
AS EACH KEY ROW
ASC ELSE LEFT SAVEPOINT
ATTACH END LIKE SELECT
AUTOINCREMENT ESCAPE LIMIT SET
BEFORE EXCEPT MATCH TABLE
BEGIN EXCLUSIVE NATURAL TEMP
BETWEEN EXISTS NO TEMPORARY
BY EXPLAIN NOT THEN
CASCADE FAIL NOTNULL TO
CASE FOR NULL TRANSACTION
CAST FOREIGN OF TRIGGER
CHECK FROM OFFSET UNION
COLLATE FULL ON UNIQUE
COLUMN GLOB OR UPDATE
COMMIT GROUP ORDER USING
CONFLICT HAVING OUTER VACUUM
CONSTRAINT IF PLAN VALUES
CREATE IGNORE PRAGMA VIEW
CROSS IMMEDIATE PRIMARY VIRTUAL
CURRENT_DATE IN QUERY WHEN
CURRENT_TIME INDEX RAISE WHERE
CURRENT_TIMESTAMP INDEXED RECURSIVE WITH
DATABASE INITIALLY REFERENCES WITHOUT
对数据库进行增删改查操作
相信你现在你已经建立好你的数据库了,那现在就让我们学习一下怎么对数据库的数据进行增删改查的操作吧~
改&增:
要更新数据,只需要创建一个ActiveAndroid Model类的新实例,并将值分配给它的域,调用save()方法,就可以啦。保存方法同样适用于插入和更新记录。下面是一个例子:
Category restaurants = new Category(); restaurants.name = "Restaurants"; restaurants.save();我们再创建一个Item数据,并将它归类到一个目录里:
Item item = new Item(); item.category = restaurants; item.name = "Outback Steakhouse"; item.save();或者再添加更多的Item:
item = new Item(); item.category = restaurants; item.name = "Red Robin"; item.save(); item = new Item(); item.category = restaurants; item.name = "Olive Garden"; item.save();接下来给大家讲一下批量插入:
为了要同时插入大量数据,你可以使用transactions。通过调用transactions里的方法能够将整个效率提高100倍左右,下面是一个例子:
ActiveAndroid.beginTransaction(); try { for (int i = 0; i < 100; i++) { Item item = new Item(); item.name = "Example " + i; item.save(); } ActiveAndroid.setTransactionSuccessful(); } finally { ActiveAndroid.endTransaction(); }
在示例中,使用transactions完成上面操作只需要4ms左右,如果我们不使用transactions的话则大概需要4s。
删:
要删除一个Item数据的话只要调用delete()就可以了
Item item = Item.load(Item.class, 1); item.delete();或者你可以静态删除它:
Item.delete(Item.class, 1);或者你也可以用查询语句进行删除:
new Delete().from(Item.class).where("Id = ?", 1).execute();查:
在ActiveAndroid里所有的查询操作都是使用查询语句或者是Model.query()方法,我们来看一看查询操作吧,这是到目前位置我们已经完成的:
@Table(name = "Items") public class Item extends Model { @Column(name = "Name") public String name; @Column(name = "Category") public Category category; }如果你是随机选一个Item去完成这次查询操作的话效果会更好一些:
public static Item getRandom() { return new Select().from(Item.class).orderBy("RANDOM()").executeSingle(); }在ActiveAndroid里进行查询操作就像在SQL里进行查询一样,我们创建了一个新的select对象,不断在Item里面找我们要的对象。 然后调用OrderBy,通过“随机”。 去查询一个调用了 execute()的表 , 或在这种情况下 executesingle() 。如果我们只想在一个确定的Category里获得items,则通过在我们类中的参数字符串。方法是这样的:
public static Item getRandom(Category category) { return new Select() .from(Item.class) .where("Category = ?", category.getId()) .orderBy("RANDOM()") .executeSingle(); }这是 我们如何 得到一个 类 的所有项目 , 按名称排序 。
public static List<Item> getAll(Category category) { return new Select() .from(Item.class) .where("Category = ?", category.getId()) .orderBy("Name ASC") .execute(); }