LiteOrm is a fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.

Overview

#LiteOrm:Android高性能数据库框架

A fast, small, powerful ORM framework for Android. LiteOrm makes you do CRUD operarions on SQLite database with a sigle line of code efficiently.

English Intro :Readme

LiteOrm是一个小巧、强大、比系统自带数据库操作性能快1倍的 android ORM 框架类库,开发者一行代码实现数据库的增删改查操作,以及实体关系的持久化和自动映射。

汉语简介 :Readme

QQ群: 新群 42960650一群(满) 47357508


1. 初步认识

自动化且比系统自带数据库操作快1倍!

LiteOrm是android上的一款数据库(ORM)框架库。速度快、体积小、性能高。开发者基本一行代码实现数据库的增删改查操作,以及实体关系的持久化和自动映射。

10万条数插入对比系统API 10万条数插入对比系统API

100 000条数据测试 100 000条数据测试

###设计原则 :

  • 轻量、专注、性能优先、线程无关,专注数据及其关系存储和操作。
  • 无需工具辅助,不需要无参构造,不需要繁多注解,约定优于配置。
  • 使用极致简约,例如:db.save(u); db.query(U.class); db.deleteAll(U.class);

###功能特点 :

  • 支持多库:每个数据库文件对应一个LiteOrm管理类实例。
  • SD卡存储:可以将DB文件放在你认为合理的位置。
  • 自动建表:开发者无需关心数据库以及表细节。
  • 库文件操作:新建、打开、删除、释放一个数据库文件。
  • 独立操作:使用 LiteOrm 的 single 实例,可与 cascade 方式平滑切换,性能高,仅处理该对象数据,其关系、和关联对象忽略;
  • 级联操作:使用 LiteOrm 的 cascade 实例,可与 single 方式平滑切换,全递归,该对象数据,及其关系、和关联对象都被处理;
  • 关系存储和恢复:真正实现实体关系映射持久化以及恢复,只需在实体的关联属性上标出关系类型即可。
  • 智能列探测:App升级或者Model改变,新加了属性字段,该字段将被探测到并加入数据库中,因此无需担心新字段不被存储。
  • 丰富API支持:save(replace), insert, update, delete, query, mapping, etc。
  • 自动识别类型:分别转化为以sqlite支持的TEXT, REAL, INTEGER, BLOB几种数据类型存储。
  • 自动构建对象,通过反射和探测构造函数参数等hack手法新建对象,大多情况下亦不需要无参构造函数。
  • 更新指定列,可灵活、强制、批量赋值,强制赋值将无视被操作对象的真实值。
  • 存储序列化字段:Date、ArrayList、Vector等各种容器智能保存及读取。
  • 约束性语法支持:NOT NULL, UNIQUE, DEFAULT, COLLATE, CHECK, PRIMARY KEY,支持冲突算法。
  • 灵活的查询和删除:columns, where, roder, limit, having group, etc。

2. 快速起步:初始化应保持单例

一个数据库对应一个LiteOrm的实例,如果一个App只有一个数据库,那么LiteOrm应该是全局单例的。 如果多次新建LiteOrm实例,系统会提示你应该关闭之前的数据库,也可能会引起其他未知错误。

保持单例:

static LiteOrm liteOrm;

if (liteOrm == null) {
    liteOrm = LiteOrm.newSingleInstance(this, "liteorm.db");
}
liteOrm.setDebugged(true); // open the log

3. 基本注解

新建一个Test Model,将其作为操作对象:

@Table("test_model")
public class TestModel {

    // 指定自增,每个对象需要有一个主键
    @PrimaryKey(AssignType.AUTO_INCREMENT)
    private int id;

    // 非空字段
    @NotNull
    private String name;

    //忽略字段,将不存储到数据库
    @Ignore
    private String password;

    // 默认为true,指定列名
    @Default("true")
    @Column("login")
    private Boolean isLogin;
}

LiteOrm将为开发者建一个名为“test_model”的数据库表,其字段为:id name login。 建表语句:CREATE TABLE IF NOT EXISTS test_model (id INTEGER PRIMARY KEY AUTOINCREMENT ,name TEXT, login TEXT DEFAULT true) 更多注解关注其他篇章或直接参看Samples。

4. 常用操作

直接操作对象即可,LiteOrm会为你完成探测、建表等工作。

  • 保存(插入or更新)
School school = new School("hello");
liteOrm.save(school);
  • 插入
Book book = new Book("good");
liteOrm.insert(book, ConflictAlgorithm.Abort);
  • 更新
book.setIndex(1988);
book.setAuthor("hehe");
liteOrm.update(book);
  • 更新指定列
// 把所有书的author强制批量改为liter
HashMap<String, Object> bookIdMap = new HashMap<String, Object>();
bookIdMap.put(Book.COL_AUTHOR, "liter");
liteOrm.update(bookList, new ColumnsValue(bookIdMap), ConflictAlgorithm.Fail);
// 仅 author 这一列更新为该对象的最新值。
//liteOrm.update(bookList, new ColumnsValue(new String[]{Book.COL_AUTHOR}, null), ConflictAlgorithm.Fail);
  • 查询
List list = liteOrm.query(Book.class);
OrmLog.i(TAG, list);
  • 查找 使用WhereBuilder
List<Student> list = liteOrm.query(new QueryBuilder<Student>(Student.class)
        .where(Person.COL_NAME + " LIKE ?", new String[]{"%0"})
        .whereAppendAnd()
        .whereAppend(Person.COL_NAME + " LIKE ?", new String[]{"%s%"}));
OrmLog.i(TAG, list);
  • 查询 根据ID
Student student = liteOrm.queryById(student1.getId(), Student.class);
OrmLog.i(TAG, student);
  • 查询 任意
List<Book> books = liteOrm.query(new QueryBuilder<Book>(Book.class)
        .columns(new String[]{"id", "author", Book.COL_INDEX})
        .distinct(true)
        .whereGreaterThan("id", 0)
        .whereAppendAnd()
        .whereLessThan("id", 10000)
        .limit(6, 9)
        .appendOrderAscBy(Book.COL_INDEX));
OrmLog.i(TAG, books);
  • 删除 实体
// 删除 student-0
liteOrm.delete(student0);
  • 删除 指定数量
// 按id升序,删除[2, size-1],结果:仅保留第一个和最后一个
// 最后一个参数可为null,默认按 id 升序排列
liteOrm.delete(Book.class, 2, bookList.size() - 1, "id");
  • 删除 使用WhereBuilder
// 删除 student-1
liteOrm.delete(new WhereBuilder(Student.class)
        .where(Person.COL_NAME + " LIKE ?", new String[]{"%1%"})
        .and()
        .greaterThan("id", 0)
        .and()
        .lessThan("id", 10000));
  • 删除全部
// 连同其关联的classes,classes关联的其他对象一带删除
liteOrm.deleteAll(School.class);
liteOrm.deleteAll(Book.class);


// 顺带测试:连库文件一起删掉
liteOrm.deleteDatabase();
// 顺带测试:然后重建一个新库
liteOrm.openOrCreateDatabase();
// 满血复活

关于作者(About Author)


我的博客 :http://vmatianyu.cn

我的开源站点 :http://litesuits.com

Comments
  •  msg = near

    msg = near "from": syntax error

    如果我的对象中一个字段名叫from,liteorm直接就报错了。log显示create table就失败了。 msg = near "from": syntax error 这样的字段话取名还要想想想是不是和sql命令冲突? 我测试加这句就好了@Column("ffrom"),但这样好难用。。。

    @PrimaryKey(PrimaryKey.AssignType.BY_MYSELF) @Column("id") private String id; private String textContent; private String from; private String to;

    opened by roytan883 26
  • 是否支持成员变量为其他对象

    是否支持成员变量为其他对象

    插入如下对象时报空指针异常:

    public class Province extends Area implements Parcelable {
    
        @JSONField(name = "cities")
        public ArrayList<City> cities;
        //...
    }
    

    其中City也继承自Area:

    public class City extends Area implements Parcelable {
    
        @JSONField(name = "areas")
        public ArrayList<Area> areas;
        //...
    }
    

    Area的结构如下:

    public class Area implements Parcelable {
        @JSONField(name = "name")
        public String name;
        @JSONField(name = "code")
        public int code;
        @JSONField(name = "level")
        public final int level;
        //...
    }
    

    异常信息如下:

     java.lang.NullPointerException
         at com.litesuits.orm.db.assit.SQLBuilder.buildInsertSql(SQLBuilder.java:270)
         at com.litesuits.orm.db.assit.SQLBuilder.buildReplaceAllSql(SQLBuilder.java:236)
         at com.litesuits.orm.db.impl.SingleSQLiteImpl.save(SingleSQLiteImpl.java:74)
         at com.parkingwang.app.support.CacheHelper.saveToDbCache_aroundBody6(CacheHelper.java:97)
         at com.parkingwang.app.support.CacheHelper$AjcClosure7.run(CacheHelper.java:1)
         at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:149)
         at hugo.weaving.internal.Hugo.logAndExecute(Hugo.java:30)
         at com.parkingwang.app.support.CacheHelper.saveToDbCache(CacheHelper.java:97)
         at com.parkingwang.app.account.vehicle.VehicleCallback.onUISuccess(VehicleCallback.java:37)
         at com.parkingwang.api.NotifyCallback.onUIResponse(NotifyCallback.java:79)
         at com.parkingwang.api.NotifyCallback.onUIResponse(NotifyCallback.java:35)
         at com.github.yoojia.fast.http.ParsableHttpCallback$1.handleMessage(ParsableHttpCallback.java:29)
         at android.os.Handler.dispatchMessage(Handler.java:106)
         at android.os.Looper.loop(Looper.java:193)
         at android.app.ActivityThread.main(ActivityThread.java:5551)
         at java.lang.reflect.Method.invokeNative(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:515)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:730)
         at dalvik.system.NativeStart.main(Native Method)
    
    opened by msdx 6
  • Android 6.0 不支持,直接报错结束。

    Android 6.0 不支持,直接报错结束。

    在6.0上报错。5.1和4.4上面正常。 输出日志

    03-05 08:12:55.621 8980-8980/? E/SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
    03-05 08:12:55.621 8980-8980/? E/SQLiteLog: (14) os_unix.c:31278: (2) open(/storage/emulated/0/xxxx/database/xxxx.db) - 
    03-05 08:12:55.622 8980-8980/? E/SQLiteDatabase: Failed to open database '/storage/emulated/0/xxxx/database/xxxx.db'.
    android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
    
    opened by leveychen 3
  • Parcelable序列化后,存不上集合数据了

    Parcelable序列化后,存不上集合数据了

    @Table("uploadtestreportdata") public class UploadTestReportData implements Serializable {

    @PrimaryKey(AssignType.AUTO_INCREMENT)
    private int ids;
    @Mapping(Relation.OneToMany)
    private ArrayList<UploadTaskResultObjectAct> taskResultList;
    

    @Table("uploadtaskresultobjectact") public class UploadTaskResultObjectAct implements Parcelable{

    @PrimaryKey(AssignType.AUTO_INCREMENT)
    private int idssss;
    
    @Column("taskId")
    private String  taskId;
    
    @Column("sampleNo")
    private String sampleNo;
    

    通过 UploadTaskResultObjectAct.class 查询不出数据了,是一个空集合

    opened by ObliverSen 1
  • 无法更新数据失败

    无法更新数据失败

    mUserInfo.setIsCurrUser("0"); Log.i("主键",mUserInfo.getId() + ""); ColumnsValue cv = new ColumnsValue(new String[]{"is_curr"}); mLiteOrm.update(mUserInfo, cv, ConflictAlgorithm.None);

    这里mUserInfo所有数据正常,主键也存在 image

    where条件的主键一直是空

    opened by Ludejin 1
  • LiteOrm.newSingleInstance(Context context, String dbName) 初始化后紧接着调用查询会查询不到内容

    LiteOrm.newSingleInstance(Context context, String dbName) 初始化后紧接着调用查询会查询不到内容

    版本:1.6.0、1.6.3 使用 LiteOrm.newSingleInstance(Context context, String dbName) 初始化数据库之后,紧接着调用query 查询会查询不到内容,即使数据库中其实有结果数据。除非在查询之前随便 liteOrm.save(...) 一下,QAQ 被坑了一整个晚上!最后的这个解决方法的发现也是突发奇想...

    作者看看是什么原因,修正一下吧😂

    opened by drakeet 1
  • 子元素是List集合,能保存关联。却无法取出。

    子元素是List集合,能保存关联。却无法取出。

    package com.litesuits.orm.junit;

    import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List;

    import com.litesuits.orm.LiteOrm; import com.litesuits.orm.db.annotation.Column; import com.litesuits.orm.db.annotation.Mapping; import com.litesuits.orm.db.annotation.PrimaryKey; import com.litesuits.orm.db.annotation.Table; import com.litesuits.orm.db.enums.AssignType; import com.litesuits.orm.db.enums.Relation; import com.litesuits.orm.model.demo.Teacher;

    import android.content.Context; import android.os.Environment; import android.test.AndroidTestCase;

    public class MyDemoTest extends AndroidTestCase {

    public static final String DB_NAME = Environment
            .getExternalStorageDirectory().getAbsolutePath()
            + "/lite/orm/love.db";
    
    public void estHello() {
        System.out.println("你好");
    }
    
    public void estSaveData() {
        Context mContext = getContext();
        LiteOrm liteOrm = LiteOrm.newCascadeInstance(mContext, DB_NAME);
        liteOrm.save(new Teacher("丽华", 23));
        liteOrm.save(getHomeTypeList());
    
    }
    
    public void estDeleteData(){
        Context mContext = getContext();
        LiteOrm liteOrm = LiteOrm.newCascadeInstance(mContext, DB_NAME);
        liteOrm.delete(HomeType.class);
    }
    
    public void testGetData(){
        Context mContext = getContext();
        LiteOrm liteOrm = LiteOrm.newCascadeInstance(mContext, DB_NAME);
        List<HomeType> hy = liteOrm.query(HomeType.class);
        System.out.println("hy = "+hy.toString());
    
    }
    
    public List<HomeType> getHomeTypeList(){
        List<HomeType>  homeTypes = new ArrayList<MyDemoTest.HomeType>();
    
        for (int i = 1; i <= 3; i++) {
            List<UserHome> userhomes = new ArrayList<MyDemoTest.UserHome>();
            UserHome[] uhs = new UserHome[3];
            for (int j = 1; j <= 3; j++) {
                userhomes.add(new UserHome("uid" + i + j, "nickname" + i + j));
                uhs[j-1] = new UserHome("uid" + i + j, "nickname" + i + j);
            }
    

    // homeTypes.add(new HomeType("hometypelist:" + i, "title," + i, // (UserHome[]) (userhomes.toArray()))); // homeTypes.add(new HomeType("hometypelist:" + i, "title," + i, // uhs)); homeTypes.add(new HomeType("hometypelist:" + i, "title," + i, userhomes)); } return homeTypes; }

    @Table("home_type")
    public static class HomeType implements Serializable {
    
        private static final long serialVersionUID = -6048223356798388872L;
        public static final String VISIBLE = "1";
        public static final String NONE = "0";
    
        @PrimaryKey(AssignType.AUTO_INCREMENT)
        @Column("db_id")
        private long db_id;
    
        @Column("hometypelist")
        private String hometypelist;
        @Column("type_id")
        private String type_id;
        private String title;
        private String image;
        private String typeinfo;
        private String home_image;
    
        /** 推荐是否有更多 0无 1 有 */
        private String usermore;
    
        @Mapping(Relation.OneToMany)
        @Column("userlist")
    

    // private UserHome[] userlist; private List userList;

        private HomeType(String hometypelist, String title,
                List<UserHome> userList) {
            this.hometypelist = hometypelist;
            this.title = title;
            this.userList = userList;
        }
    
    
        public String getHometypelist() {
            return hometypelist;
        }
    
        public void setHometypelist(String hometypelist) {
            this.hometypelist = hometypelist;
        }
    
        public String getType_id() {
            return type_id;
        }
    
        public void setType_id(String type_id) {
            this.type_id = type_id;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getImage() {
            return image;
        }
    
        public void setImage(String image) {
            this.image = image;
        }
    
        public String getTypeinfo() {
            return typeinfo;
        }
    
        public void setTypeinfo(String typeinfo) {
            this.typeinfo = typeinfo;
        }
    

    // public UserHome[] getUserlist() { // return userlist; // } // // public void setUserlist(UserHome[] userlist) { // this.userlist = userlist; // }

        public String getHome_image() {
            return home_image;
        }
    
        public void setHome_image(String home_image) {
            this.home_image = home_image;
        }
    
        /** 推荐是否有更多 0无 1 有 */
        public String getUsermore() {
            return usermore;
        }
    
        public void setUsermore(String usermore) {
            this.usermore = usermore;
        }
    
        @Override
        public String toString() {
            return "HomeType [hometypelist=" + hometypelist + ", type_id="
                    + type_id + ", title=" + title + ", image=" + image
                    + ", typeinfo=" + typeinfo + ", home_image=" + home_image
    

    // + ", userlist=" + Arrays.toString(userlist) + "]"; + ", userlist=" + userList.toString() + "]"; }

    }
    
    @Table("user_home")
    public static class UserHome implements Serializable {
    
        private static final long serialVersionUID = -1311542533996146739L;
    
        @PrimaryKey(AssignType.AUTO_INCREMENT)
        @Column("db_id")
        private long db_id;
    
        @Column("uid")
        private String uid;
        @Column("easemob_uuid")
        private String easemob_uuid;
        @Column("gender")
        private String gender;
        @Column("nickname")
        private String nickname;
        @Column("header")
        private String header;
        @Column("voice")
        private String voice;
        @Column("voice_time")
        private String voice_time;
    
    
    
        private UserHome(String uid, String nickname) {
            this.uid = uid;
            this.nickname = nickname;
        }
    
        public String getUid() {
            return uid;
        }
    
        public void setUid(String uid) {
            this.uid = uid;
        }
    
        public String getEasemob_uuid() {
            return easemob_uuid;
        }
    
        public void setEasemob_uuid(String easemob_uuid) {
            this.easemob_uuid = easemob_uuid;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        public String getNickname() {
            return nickname;
        }
    
        public void setNickname(String nickname) {
            this.nickname = nickname;
        }
    
        public String getHeader() {
            return header;
        }
    
        public void setHeader(String header) {
            this.header = header;
        }
    
        public String getVoice() {
            return voice;
        }
    
        public void setVoice(String voice) {
            this.voice = voice;
        }
    
        public String getVoice_time() {
            return voice_time;
        }
    
        public void setVoice_time(String voice_time) {
            this.voice_time = voice_time;
        }
    
        @Override
        public String toString() {
            return "UserHome [db_id=" + db_id + ", uid=" + uid
                    + ", easemob_uuid=" + easemob_uuid + ", gender=" + gender
                    + ", nickname=" + nickname + ", header=" + header
                    + ", voice=" + voice + ", voice_time=" + voice_time + "]";
        }
    
    }
    

    }

    opened by sfyc23 1
  • 我遇到一个问题,不知道是个人原因还是框架的原因,希望能够帮我解答!

    我遇到一个问题,不知道是个人原因还是框架的原因,希望能够帮我解答!

    有两个Activity:FirstActivity,SecondActivity 1、我在FirstActivity获取服务器上的数据,并保存数据表为test 2、FirstActivity执行finish(),打开SecondActivity 3、SecondActivity查询test表,查不出数据,而且输出的表名为空 4、SecondActivity执行finish(),回到FirstActivity,FirstActivity可以查出数据 重复第2项的操作,结果与第3的一样 注:导出的db文件可以看到已保存的数据。

    opened by PassersHowe 0
  • jar包在系统源码中引入失败,

    jar包在系统源码中引入失败,

    报这种注解错误NotNull cannot be resolved to a type,The import com.litesuits cannot be resolved 我的一个项目是要在系统源码中编译运行,在Androidstudio 中引入这个jar包没问题但放到系统源码编译就出现了找不到

    opened by huanyuan 0
  • W/System.err: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)

    W/System.err: android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)

    全局使用一个sqlite public static LiteOrm getOrmInstance(){ if (liteOrm == null) { synchronized (OrmUtil.class){ if(liteOrm==null){ liteOrm = LiteOrm.newSingleInstance(MyApplication.getAppContext(), "liteorm.db"); } } } liteOrm.setDebugged(true); // open the log return liteOrm; } 出现这种问题java.lang.IllegalStateException: attempt to re-open an already-closed object: 怎么解决啊 作者,有时间看下

    opened by forTribeforXuanmo 0
Owner
马天宇
welcome to http://litesuits.com
马天宇
droidparts 6.7 0.0 L5 Java DI, ORM, JSON, ...

DroidParts a carefully crafted Android framework that includes: DI - injection of Views, Fragments, Services, etc. ORM - efficient persistence utilizi

DroidParts 779 Dec 21, 2022
A small, yet full-featured framework that allows building View-based Android applications

Conductor A small, yet full-featured framework that allows building View-based Android applications. Conductor provides a light-weight wrapper around

BlueLine Labs 3.9k Jan 6, 2023
Create kotlin android project with one line of command.

README This is an android application template project built with kotlin language and some useful libraries. It provides a creator script to quickly c

nekocode 1.6k Dec 20, 2022
Create kotlin android project with one line of command.

README This is an android application template project built with kotlin language and some useful libraries. It provides a creator script to quickly c

nekocode 1.6k Dec 20, 2022
Small Warp Plugin developed in Kotlin

Warps A small warps plugin for the 1.17 SMP. Minecraft 1.17 Spigot Contributing Install Java 16 Fork this repo Clone your fork Make your changes Use h

MenuDocs 6 Feb 19, 2022
Rosie is an Android framework to create applications following the principles of Clean Architecture.

Rosie The only way to make the deadline—the only way to go fast—is to keep the code as clean as possible at all times. — Robert C. Martin in Clean Cod

Karumi 1.8k Dec 28, 2022
A data-binding Presentation Model(MVVM) framework for the Android platform.

PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED. As personal time contraints, I am currently unable to keep up. Please use official android da

RoboBinding open source 1.3k Dec 9, 2022
A full-featured framework that allows building android applications following the principles of Clean Architecture.

EasyMVP A powerful, and very simple MVP library with annotation processing and bytecode weaving. EasyMVP eliminates the boilerplate code for dealing w

null 1.3k Nov 19, 2022
Android Plugin Framework

Android Plugin Framework This project is pre-mature and may be changed very frequently. Introduction Android Plugin Framework (APF) aims to providing

Umeng Limited 322 Nov 17, 2022
MVVM framework for Android

RoboMVVM - MVVM Framework For Android RoboMVVM is an open source library that facilitates the use of the MVVM pattern in Android apps. The MVVM patter

Debdatta Basu 55 Nov 24, 2020
kotlin-core - A full framework for making Android apps. Based on Anko and Kotson.

kotlin-core This package is not Android-specific, and can be used across platforms. However, for a good example of use in Android, take a look at kotl

Lightning Kite 36 Oct 3, 2022
Cross-platform framework for building truly native mobile apps with Java or Kotlin. Write Once Run Anywhere support for iOS, Android, Desktop & Web.

Codename One - Cross Platform Native Apps with Java or Kotlin Codename One is a mobile first cross platform environment for Java and Kotlin developers

Codename One 1.4k Dec 23, 2022
🔥 Android component-based routing framework

README-CN Latest version module krouter-core krouter-compiler krouter-annotation krouter-plugin version Features 支持通过路由获取intent 支持方法注解,通过路由调用方法 支持给fra

Jiaming Gu 6 Jun 24, 2022
VasSonic is a lightweight and high-performance Hybrid framework developed by tencent VAS team, which is intended to speed up the first screen of websites working on Android and iOS platform.

VasSonic: A Lightweight And High-performance Hybrid Framework VasSonic is a lightweight and high-performance Hybrid framework developed by tencent VAS

Tencent 11.6k Dec 30, 2022
🔪 AOP development framework implemented through *Annotation + ASM + Gradle Transform API* for Android🤖

?? AOP development framework implemented through *Annotation + ASM + Gradle Transform API* for Android??

Pumpkin 325 Nov 22, 2022
UltimateAndroid is a rapid development framework for developing your apps

UltimateAndroid Version:0.10.2 UltimateAndroid is a rapid development framework for developing apps Master branch: Dev branch: V0.7.0 Ui Demo screensh

MarshalChen 2.1k Dec 26, 2022
A framework for hook java methods.

Legend Projects are out of date, plese move to: Whale Hook What is Legend? Legend is a Hook framework for Android Development, it allows you to Hook J

Lody 1.6k Dec 15, 2022
A modern framework for full stack web apps in Kotlin

Kobweb is an opinionated Kotlin framework for creating websites and web apps, built on top of Web Compose and inspired by Next.js and Chakra UI.

Varabyte 425 Jan 8, 2023
🚀Plugin for Android Studio And IntelliJ Idea to generate Kotlin data class code from JSON text ( Json to Kotlin )

JsonToKotlinClass Hi, Welcome! This is a plugin to generate Kotlin data class from JSON string, in another word, a plugin that converts JSON string to

Seal 2.8k Jan 3, 2023