Android SugarORM(1)

Android Sugar ORM (1)

Android Sugar ORM比我之前用过的ORM都要简单许多, 其目的是简化与Android中SQLite数据库的交互, 优点如下:

  • 消除了编写SQL查询以及与SQLite数据库进行交互
  • Sugar ORM负责创建数据库
  • Sugar ORM负责管理对象关系
  • Sugar ORM提供了用户数据库操作的简单清晰的api

Android Sugar ORM 的使用

1. 下载

官方文档上写的是需要在build.gradle中添加, 如果使用的Android Studio, 需要在build.gradle:(Module: app)下的dependencies中添加即可, 官网示例:

compile 'com.github.satyan:sugar:1.3'

但是貌似compile已经被弃用了, 现在使用的是implementation, 而且有目前我了解到的, 有1.4和1.5两个版本可以使用

implementation 'com.github.satyan:sugar:1.4'

implementation 'com.github.satyan:sugar:1.5'

本篇采用的Sugar ORM: 1.5

2. 配置

开始使用Sugar ORM前需要在AndroidManifest.xml中进行简单的配置, 有一个比较需要注意的点, 就是需要设置<application>标签下的android:name属性, 以及几项元数据, 你可以配置为你想要的包, 这时有两种方式, 比如:

  • android:name="com.orm.SugarApp"使用这种方式时, 只需进行配置元数据即可
  • android:name=".App"使用这种方式时需要另外做下面几项修改, 其中.App是任意你自定义的包
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    android:name=".App">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <meta-data android:name="DATABASE" android:value="data.db" />
    <meta-data android:name="VERSION" android:value="1" />
    <meta-data android:name="QUERY_LOG" android:value="true" />
    <meta-data android:name="DOMAIN_PACKAGE_NAME" android:value="com.example" />
</application>

元数据标记都是可选的, 用途如下:

元数据 描述
DATABASE 生成的SQLite数据库名称
VERSION 数据库架构的版本
QUERT_LOG 记录日志, true:保存;false:不保存
DOMAIN_PACKAGE_NAME 指定存在域/实体类的包名称

配置完以后会发现android:name=".App"可能会报红, Android Studio下按下Alt+Enter创建App类, 这时候Android Studio会自动生成一个App类继承于Application改为继承于SugarApp, 并重写onCreate()onTerminate():

public class App extends SugarApp {
    @Override
    public void onCreate() {
        super.onCreate();
        SugarContext.init(this);
    }

    @Override
    public void onTerminate() {
        SugarContext.terminate();
        super.onTerminate();
    }
}

3. 创建一个实体

这里有两种写法

public class Book extends SugarRecord<Book> {
    String title;
    String edition;

    public Book(){
    }

    public Book(String title, String edition){
        this.title = title;
        this.edition = edition;
    }
}

在网上搜一些资料, 有的第二种写法是继承的是Model类, 但是我试了后不行, 我改成了继承于SugarRecord类, 试验后发现也可以, 后来查资料发现这个Model可能是SugarRecord.Model, 可能是版本问题, 我用的Sugar ORM: 1.5版本, 发现SugarRecord下并没有Model, 这个还有待研究一下.

@Table(name = "Book")
public class Book extends SugarRecord {
    @Column(name = "title")
    String title;
    @Column(name = "edition")
    String edition;

    public Book(){
    }

    public Book(String title, String edition){
        this.title = title;
        this.edition = edition;
    }
}

4. 基本用法

Sugar ORM执行CRUD操作非常简单, 只需要简单的效用类似于sava(), delete(), findById()这类的方法, 当你存入数据的时候, 会自动生成一个索引, 我们截取SugarRecord的一部分源代码就可以看到会有一个id:

public class SugarRecord {

    public static final String SUGAR = "Sugar";
    private Long id = null;

    private static SQLiteDatabase getSugarDataBase() {
        return getSugarContext().getSugarDb().getDB();
    }

    public static <T> int deleteAll(Class<T> type) {
        return deleteAll(type, null);
    }

    public static <T> int deleteAll(Class<T> type, String whereClause, String... whereArgs) {
        return getSugarDataBase().delete(NamingHelper.toSQLName(type), whereClause, whereArgs);
    }
}

值得注意的是这个idlong类型的, 在用的时候应该没有什么太大的问题, 此外官网特别提醒了一下, Sugar ORM的记录索引值是从1开始的

保存实体:

Book book = new Book(ctx, "Title here", "2nd edition")
book.save();

加载实体:

Book book = Book.findById(Book.class, 1);

更新实体:

Book book = Book.findById(Book.class, 1);
book.title = "updated title here";
book.edition = "3rd edition";
book.save();

删除实体:

Book book = Book.findById(Book.class, 1);
book.delete();

批量操作:

// 批量删除
List<Book> books = Book.listAll(Book.class);
Book.deleteAll(Book.class);
// 批量查询
Iterator<User> all = User.findAll(User.class);
while (all.hasNext()){
    User next = all.next();
    Log.i("Sugar ORM", "onCreate: " + next.toString() + ":"+next.getId()+":"+next.username+":"+next.password);
}
原文地址:https://www.cnblogs.com/donpangpang/p/12746120.html