android app orm框架 - mindpin/knowledge-space-net-lib GitHub Wiki

需要考虑的因素从给出的以下六个方面考虑

  • 数据库配置(如何引入jar包,增加全局配置)
  • 模型如何配置从而映射到数据表
  • 模型如何进行单独的增删改查
  • 一对一,一对多,多对多的关联关系如何声明和使用
  • 是否有比较便捷的migrate方案
  • 框架的优缺点

这里使用的是ActiveAndroid的ORM框架 ActiveAndroid(https://github.com/pardom/ActiveAndroid)

一. 数据库配置(如何引入jar包,增加全局配置) 有三种情况可以选择

前提拿到ActiveAndroid的Jar包 下载源码文件: git clone [email protected]:pardom/ActiveAndroid.git

拿到jar包可以有多种手段

使用gradle(run gradle -> gradle tasks -> gradle build -> gradle jar) 会在源码包中的目录中生成Jar包(ActiveAndroid/build/libs/activeandroid.jar)

*1.使用系统给我们的Application

manifest.xml

<application
        ··········
        android:name="com.activeandroid.app.Application"
    >
        <meta-data android:name="AA_DB_NAME" android:value="数据库名称.db" />
        <meta-data android:name="AA_DB_VERSION" android:value="版本数字" />
        ·······
    </application>

*2.需要定义我们自己的Application时

manifest.xml

<application
        ···········
        android:name=".TestOrmApplication"
    >
        <meta-data android:name="AA_DB_NAME" android:value="数据库名称.db" />
        <meta-data android:name="AA_DB_VERSION" android:value="版本数字" />
        ···········
    </application>

TestOrmApplication.java

public class TestOrmApplication extends com.activeandroid.app.Application {
   @Override
   public void onCreate() {
      super.onCreate();
   }
   ···············
}

*3.如果你自己的Application已经继承了别的库的类可以

manifest.xml

<application
        ···········
        android:name=".TestOrmApplication"
    >
        <meta-data android:name="AA_DB_NAME" android:value="数据库名称.db" />
        <meta-data android:name="AA_DB_VERSION" android:value="版本数字" />
        ···········
    </application>

TestOrmApplication.java

public class TestOrmApplication extends SomeLibraryApplication{
  @Override
  public void onCreate() {
    super.onCreate();
     ActiveAndroid.initialize(this);
  }
  @Override
  public void onTerminate() {
    super.onTerminate();
    ActiveAndroid.dispose();
  }
}

二. 模型如何配置从而映射到数据表

表名,属性名以及索引的声明分别是(table,column,index)方式如下

@Table(name = "Categories")
public class Category extends Model{
    @Column(name = "Name", index = true)
    public String name;
}

三. 模型如何进行单独的增删改查

增/改 改和增是一样的

// addd
  private void add_category() {
    Category restaurants = new Category();
    restaurants.name = "Restaurants";
    restaurants.save();
  }
  
  private void add_item() {
    Category restaurants = new Category();
    restaurants.name = "Restaurants";
    
    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();
  }
  
  private void add_add_transaction() {
    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();
    }
  }

  // delete
  private void delete_item_1() {
    Item item = Item.load(Item.class, 1);
    item.delete();
  }
  
  private void delete_item_2() {
    Item.delete(Item.class, 1);
  }
  
  private void delete_item_3() {
    new Delete().from(Item.class).where("Id = ?", 1).execute();
  }

  // query
  private Item get_random() {
    return new Select().from(Item.class).orderBy("RANDOM()").executeSingle();
  }
  
  private 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();
  }

四. 一对一,一对多,多对多的关联关系如何声明和使用

一对一我没有找到对应的方法

一对多

@Table(name = "Categories")
public class Category extends Model{
    @Column(name = "Name")
    public String name;
  
    public List<Item> items() {
        return getMany(Item.class, "Category");
    }
}

@Table(name = "Items")
public class Item extends Model{
    @Column(name = "Name")
    public String name;

    @Column(name = "Category", index = true)
    public Category category;
}

其实一对多和多对多是差不多的

@Table(name = "Categories")
public class Category extends Model{
    @Column(name = "Name")
    public String name;
    
    @Column(name = "Item")
    public Item item;
    
    public List<Item> items() {
        return getMany(Item.class, "Category");

五. 是否有比较便捷的migrate方案

在ActiveAndroid中,当数据库结构有变化时,也就是说,当标注有@Table注解的类有变化时可以按以下方式进行数据库迁移:

1.递增AndroidManifest.xml文件中AA_DB_VERSION的值。 2.在/assets/migrations目录下提供.sql升级脚本,如果这个数据库脚本的文件名大于旧的数据库版本号并且小于等于新的数据库版本号,这时该脚本将会被自动执行。 sql例如:

mainfest.xml

<meta-data android:name="AA_DB_VERSION" android:value="4" />

./assets/migrations/3.sql

./assets/migrations/4.sql

alter table Categories add columntag char(200);

强调 ./assets/migrations/.. 要执行的sql文件必须要有一个 小于当前版本号的sql文件

六. 框架的优缺点

有利就有弊

操作简单 配置麻烦

⚠️ **GitHub.com Fallback** ⚠️