ActiveAndroid (二):如何进行增删改查

上一篇在这: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;
        }
}
在前面的叙述中,我们使用了CategoriesItems来作为例子。其中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();
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。