Coder Social home page Coder Social logo

litepal's Introduction

LitePal for Android

Logo

中文文档

LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most of the database operations without writing even a SQL statement, including create or upgrade tables, crud operations, aggregate functions, etc. The setup of LitePal is quite simple as well, you can integrate it into your project in less than 5 minutes.

Experience the magic right now and have fun!

Features

  • Using object-relational mapping (ORM) pattern.
  • Almost zero-configuration(only one configuration file with few properties).
  • Maintains all tables automatically(e.g. create, alter or drop tables).
  • Multi databases supported.
  • Encapsulated APIs for avoiding writing SQL statements.
  • Awesome fluent query API.
  • Alternative choice to use SQL still, but easier and better APIs than the originals.
  • More for you to explore.

Quick Setup

1. Include library

Edit your build.gradle file and add below dependency.

dependencies {
    implementation 'org.litepal.guolindev:core:3.2.3'
}

2. Configure litepal.xml

Create a file in the assets folder of your project and name it as litepal.xml. Then copy the following codes into it.

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <!--
    	Define the database name of your application. 
    	By default each database name should be end with .db. 
    	If you didn't name your database end with .db, 
    	LitePal would plus the suffix automatically for you.
    	For example:    
    	<dbname value="demo" />
    -->
    <dbname value="demo" />

    <!--
    	Define the version of your database. Each time you want 
    	to upgrade your database, the version tag would helps.
    	Modify the models you defined in the mapping tag, and just 
    	make the version value plus one, the upgrade of database
    	will be processed automatically without concern.
			For example:    
    	<version value="1" />
    -->
    <version value="1" />

    <!--
    	Define your models in the list with mapping tag, LitePal will
    	create tables for each mapping class. The supported fields
    	defined in models will be mapped into columns.
    	For example:    
    	<list>
    		<mapping class="com.test.model.Reader" />
    		<mapping class="com.test.model.Magazine" />
    	</list>
    -->
    <list>
    </list>
    
    <!--
        Define where the .db file should be. "internal" means the .db file
        will be stored in the database folder of internal storage which no
        one can access. "external" means the .db file will be stored in the
        path to the directory on the primary external storage device where
        the application can place persistent files it owns which everyone
        can access. "internal" will act as default.
        For example:
        <storage value="external" />
    -->
    
</litepal>

This is the only configuration file, and the properties are simple.

  • dbname configure the database name of project.
  • version configure the version of database. Each time you want to upgrade database, plus the value here.
  • list configure the mapping classes.
  • storage configure where the database file should be stored. internal and external are the only valid options.

3. Configure LitePalApplication

You don't want to pass the Context param all the time. To makes the APIs simple, just configure the LitePalApplication in AndroidManifest.xml as below:

<manifest>
    <application
        android:name="org.litepal.LitePalApplication"
        ...
    >
        ...
    </application>
</manifest>

Of course you may have your own Application and has already configured here, like:

<manifest>
    <application
        android:name="com.example.MyOwnApplication"
        ...
    >
        ...
    </application>
</manifest>

That's OK. LitePal can still live with that. Just call LitePal.initialize(context) in your own Application:

public class MyOwnApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        LitePal.initialize(this);
    }
    ...
}

Make sure to call this method as early as you can. In the onCreate() method of Application will be fine. And always remember to use the application context as parameter. Do not use any instance of activity or service as parameter, or memory leaks might happen.

Get Started

After setup, you can experience the powerful functions now.

1. Create tables

Define the models first. For example you have two models, Album and Song. The models can be defined as below:

public class Album extends LitePalSupport {
	
    @Column(unique = true, defaultValue = "unknown")
    private String name;
    
    @Column(index = true)
    private float price;
	
    private List<Song> songs = new ArrayList<>();

    // generated getters and setters.
    ...
}
public class Song extends LitePalSupport {
	
    @Column(nullable = false)
    private String name;
	
    private int duration;
	
    @Column(ignore = true)
    private String uselessField;
	
    private Album album;

    // generated getters and setters.
    ...
}

Then add these models into the mapping list in litepal.xml:

<list>
    <mapping class="org.litepal.litepalsample.model.Album" />
    <mapping class="org.litepal.litepalsample.model.Song" />
</list>

OK! The tables will be generated next time you operate database. For example, gets the SQLiteDatabase with following codes:

SQLiteDatabase db = LitePal.getDatabase();

Now the tables will be generated automatically with SQLs like this:

CREATE TABLE album (
	id integer primary key autoincrement,
	name text unique default 'unknown',
	price real
);

CREATE TABLE song (
	id integer primary key autoincrement,
	name text not null,
	duration integer,
	album_id integer
);

2. Upgrade tables

Upgrade tables in LitePal is extremely easy. Just modify your models anyway you want:

public class Album extends LitePalSupport {
	
    @Column(unique = true, defaultValue = "unknown")
    private String name;
	
    @Column(ignore = true)
    private float price;
	
    private Date releaseDate;
	
    private List<Song> songs = new ArrayList<>();

    // generated getters and setters.
    ...
}

A releaseDate field was added and price field was annotated to ignore. Then increase the version number in litepal.xml:

<!--
    Define the version of your database. Each time you want 
    to upgrade your database, the version tag would helps.
    Modify the models you defined in the mapping tag, and just 
    make the version value plus one, the upgrade of database
    will be processed automatically without concern.
    For example:    
    <version value="1" />
-->
<version value="2" />

The tables will be upgraded next time you operate database. A releasedate column will be added into album table and the original price column will be removed. All the data in album table except those removed columns will be retained.

But there are some upgrading conditions that LitePal can't handle and all data in the upgrading table will be cleaned:

  • Add a field which annotated as unique = true.
  • Change a field's annotation into unique = true.
  • Change a field's annotation into nullable = false.

Be careful of the above conditions which will cause losing data.

3. Save data

The saving API is quite object oriented. Each model which inherits from LitePalSupport would have the save() method for free.

Java:

Album album = new Album();
album.setName("album");
album.setPrice(10.99f);
album.setCover(getCoverImageBytes());
album.save();
Song song1 = new Song();
song1.setName("song1");
song1.setDuration(320);
song1.setAlbum(album);
song1.save();
Song song2 = new Song();
song2.setName("song2");
song2.setDuration(356);
song2.setAlbum(album);
song2.save();

Kotlin:

val album = Album()
album.name = "album"
album.price = 10.99f
album.cover = getCoverImageBytes()
album.save()
val song1 = Song()
song1.name = "song1"
song1.duration = 320
song1.album = album
song1.save()
val song2 = Song()
song2.name = "song2"
song2.duration = 356
song2.album = album
song2.save()

This will insert album, song1 and song2 into database with associations.

4. Update data

The simplest way, use save() method to update a record found by find().

Java:

Album albumToUpdate = LitePal.find(Album.class, 1);
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.save();

Kotlin:

val albumToUpdate = LitePal.find<Album>(1)
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.save()

Each model which inherits from LitePalSupport would also have update() and updateAll() method. You can update a single record with a specified id.

Java:

Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.update(id);

Kotlin:

val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.update(id)

Or you can update multiple records with a where condition.

Java:

Album albumToUpdate = new Album();
albumToUpdate.setPrice(20.99f); // raise the price
albumToUpdate.updateAll("name = ?", "album");

Kotlin:

val albumToUpdate = Album()
albumToUpdate.price = 20.99f // raise the price
albumToUpdate.updateAll("name = ?", "album")

5. Delete data

You can delete a single record using the static delete() method in LitePal.

Java:

LitePal.delete(Song.class, id);

Kotlin:

LitePal.delete<Song>(id)

Or delete multiple records using the static deleteAll() method in LitePal.

Java:

LitePal.deleteAll(Song.class, "duration > ?" , "350");

Kotlin:

LitePal.deleteAll<Song>("duration > ?" , "350")

6. Query data

Find a single record from song table with specified id.

Java:

Song song = LitePal.find(Song.class, id);

Kotlin:

val song = LitePal.find<Song>(id)

Find all records from song table.

Java:

List<Song> allSongs = LitePal.findAll(Song.class);

Kotlin:

val allSongs = LitePal.findAll<Song>()

Constructing complex query with fluent query.

Java:

List<Song> songs = LitePal.where("name like ? and duration < ?", "song%", "200").order("duration").find(Song.class);

Kotlin:

val songs = LitePal.where("name like ? and duration < ?", "song%", "200").order("duration").find<Song>()

7. Multiple databases

If your app needs multiple databases, LitePal support it completely. You can create as many databases as you want at runtime. For example:

LitePalDB litePalDB = new LitePalDB("demo2", 1);
litePalDB.addClassName(Singer.class.getName());
litePalDB.addClassName(Album.class.getName());
litePalDB.addClassName(Song.class.getName());
LitePal.use(litePalDB);

This will create a demo2 database with singer, album and song tables.

If you just want to create a new database but with same configuration as litepal.xml, you can do it with:

LitePalDB litePalDB = LitePalDB.fromDefault("newdb");
LitePal.use(litePalDB);

You can always switch back to default database with:

LitePal.useDefault();

And you can delete any database by specified database name:

LitePal.deleteDatabase("newdb");

8. Transaction

LitePal support transaction for atomic db operations. All operations in the transaction will be committed or rolled back together.

Java usage:

LitePal.beginTransaction();
boolean result1 = // db operation1
boolean result2 = // db operation2
boolean result3 = // db operation3
if (result1 && result2 && result3) {
    LitePal.setTransactionSuccessful();
}
LitePal.endTransaction();

Kotlin usage:

LitePal.runInTransaction {
    val result1 = // db operation1
    val result2 = // db operation2
    val result3 = // db operation3
    result1 && result2 && result3
}

ProGuard

If you are using ProGuard you might need to add the following option:

-keep class org.litepal.** {*;}
-keep class * extends org.litepal.crud.LitePalSupport {*;}

Bugs Report

If you find any bug when using LitePal, please report here. Thanks for helping us making better.

Change logs

3.2.3

  • Support database index by adding @Column(index = true) on field.
  • Adding return value for runInTransaction() function for Kotlin.
  • Fix known bugs.

3.1.1

  • Support transaction.
  • Add return value for LitePal.saveAll() method.
  • No longer support byte array field as column in table.
  • Deprecate all async methods. You should handle async operations by yourself.
  • Fix known bugs.

3.0.0

  • Optimize generic usage for async operation APIs.
  • Add LitePal.registerDatabaseListener() method for listening create or upgrade database events.
  • Provider better CRUD API usage for using generic declaration instead of Class parameter for kotlin.
  • Fix known bugs.

2.0.0

  • Offer new APIs for CRUD operations. Deprecate DataSupport, use LitePal and LitePalSupport instead.
  • Fully support kotlin programming.
  • Fix known bugs.

1.6.1

  • Support AES and MD5 encryption with @Encrypt annotation on fields.
  • Support to store database file on any directory of external storage.
  • Fix known bugs.

1.5.1

  • Support async operations for all crud methods.
  • Add saveOrUpdate() method in DataSupport.
  • Fix known bugs.

1.4.1

  • Support multiple databases.
  • Support crud operations for generic collection data in models.
  • Add SQLite keywords convert function to avoid keywords conflict.
  • Fix bug of DateSupport.count error.
  • Fix bug of losing blob data when upgrading database.
  • Fix other known bugs.

1.3.2

  • Improve an outstanding speed up of querying and saving.
  • Support to store database file in external storage.
  • Support to mapping fields which inherit from superclass.
  • Add findFirst() and findLast() in fluent query.
  • Add isExist() and saveIfNotExist() method in DataSupport.

1.3.1

  • Support storing binary data. Byte array field will be mapped into database as blob type.
  • Add saveFast() method in DataSupport. If your model has no associations to handle, use saveFast() method will be much more efficient.
  • Improve query speed with optimized algorithm.

1.3.0

  • Add annotation functions to declare unique, not null and default constraints.
  • Remove the trick of ignore mapping fields with non-private modifier.
  • Support to use annotation to ignore mapping fields with ignore = true
  • Add some magical methods in DataSupport for those who understand LitePal deeper.
  • Fix known bugs.

License

Copyright (C) Lin Guo, LitePal Framework Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

litepal's People

Contributors

guolindev avatar gutao avatar hearsilent avatar sinyu890807 avatar zcc1234567 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

litepal's Issues

org.litepal.exceptions.DataSupportException: getİnt [int]

Caused by: org.litepal.exceptions.DataSupportException: getİnt [int]
org.litepal.crud.DataHandler.query(DataHandler.java:141)
org.litepal.crud.QueryHandler.onFindAll(QueryHandler.java:122)
org.litepal.crud.DataSupport.findAll(DataSupport.java:628)
org.litepal.crud.DataSupport.findAll(DataSupport.java:609)

the default id

Database default ID name is id, and the server returns the id conflict, hope the default database generated id named _id.

the id type only long or int

10-21 07:59:24.856: W/System.err(6429): org.litepal.exceptions.DataSupportException: id type is not supported. Only int or long is acceptable for id

能否支持 public 属性?

貌似只能是 private,求支持 public 属性,或者告知下怎么修改源码来获得这一支持,非常感谢!

A Bug For LitePal

My Problem :
My database has a table,and the table is More 2 More type, EntityA has a List EntityB ,and EntityB has a List EntityA ,and LitePal will be create a middle tab named "EntityA_EntityB".
when entityA execute save() method ,I will find the middle table will create a record auto,and It's right,But when i execute update method , I would not find any record created in middle table, so I think the update method wheather has some problem. I will watch souce code ,and If you think the problem is not here ,please point me some way to solve it, thanks

the default id

Database default ID name is ID, and the server returns the ID conflict, hope the default database generated ID named _id.

缺乏必要的Debug调试支持

虽然库用起来很方便,但是有些实现,例如版本升级到底是如何实现的,如果能把对应的sql语句大致打印出来,用户马上就明白了。

例如你博客上描述的删除一个字段采用将原先的表数据全部都迁移到新表的方式,对于有些应用可能会有性能风险。

如果能打印出来sql语言,如何实现一目了然,用户也可以更方便的使用你的库了。

国产的另外一个ORM库afinal,虽然没有litepal强大,但是他支持debug参数,设计上会更好些。

how to save a batch results?

I get a wifiScanResults which contains many access point informaction, and want to save them into the sqlite database with litepal with the following codes.

But something interesting happens, only the last one of the batch results is correctly saved. The others are lost , however, "wifiTable.isSaved()" returns true during the for loop.

for(ScanResult result : wifiScanResults){
wifiTable.setSsid(result.SSID);
wifiTable.setBssid(result.BSSID);
wifiTable.setRssi(result.level);
wifiTable.setCapbility(result.capabilities);
wifiTable.setFrequency(result.frequency);
wifiTable.save();
Log.e(tag,"wifiTable is saved :"+ wifiTable.isSaved());
}

near "null": syntax error (code 1): , while compiling: INSERT INTO feed(null) VALUES (NULL)

I have a code:

for (Feed feed : feeds) {
    feed.save();
}

throws an android.database.sqlite.SQLiteException:

10-10 07:13:17.105    1468-1498/me.drakeet.***** E/SQLiteLog﹕ (1) near "null": syntax error
10-10 07:13:17.105    1468-1498/me.drakeet.***** E/SQLiteDatabase﹕ Error inserting
    android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: INSERT INTO feed(null) VALUES (NULL)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
            at org.litepal.crud.SaveHandler.saving(SaveHandler.java:190)
            at org.litepal.crud.SaveHandler.doSaveAction(SaveHandler.java:151)
            at org.litepal.crud.SaveHandler.onSave(SaveHandler.java:79)
            at org.litepal.crud.DataSupport.saveThrows(DataSupport.java:1057)
            at org.litepal.crud.DataSupport.save(DataSupport.java:1020)
            at me.drakeet.*****.ui.fragment.MainFragment$2$1.doInBackground(MainFragment.java:193)

Does it belong to the library bug?
Thanks!

必须继承DataSupport造成Serializable失败

场景:
点击按钮A, 打开一个activity, 同时通过Intent.putSerializable传递一个Model数据结构MyEntity,
这个数据结构定义如下

MyEntity implements Serializable extends DataSupport {
}

为了方便将很多参数传递给activity, 所以这里利用了Serializable的方式直接将整个entity序列化给了activity, 但是由于父类的DataSupport的原因,序列化失败了。

目前的解决办法是自定义Serialization的writeObject和readObject来解决,复杂度增加很多。

但是从OO角度看,继承意味着"is A"的关系, cat "is A" Animal, 但是Entity "is not A" DataSupport, 虽然代码写起来方便,但是设计上完成乱了。

数据库的名必须固定

数据库的名是固定的,这个有点坑吧。
建议:
像QQ那种,不同用户应该有对应的user信息 、friends、groups。

QQ-steven.DB
user ------mapping class ----- user
friends ------mapping class ----- friends
groups------mapping class ----- groups
QQ-cyning.DB
user ------mapping class ----- user
friends ------mapping class ----- friends
groups------mapping class ----- groups

I think my configuration of litepal is correct. But when I save data in activity, it was crashed.

Here is the error:
W/System.err﹕ java.lang.NullPointerException
W/System.err﹕ at android.content.ContextWrapper.getAssets(ContextWrapper.java:83)
W/System.err﹕ at org.litepal.parser.LitePalParser.getConfigInputStream(LitePalParser.java:188)
W/System.err﹕ at org.litepal.parser.LitePalParser.useSAXParser(LitePalParser.java:116)
W/System.err﹕ at org.litepal.parser.LitePalParser.parseLitePalConfiguration(LitePalParser.java:97)
W/System.err﹕ at org.litepal.tablemanager.Connector.buildConnection(Connector.java:116)
W/System.err﹕ at org.litepal.tablemanager.Connector.getWritableDatabase(Connector.java:62)
W/System.err﹕ at org.litepal.tablemanager.Connector.getDatabase(Connector.java:97)
W/System.err﹕ at org.litepal.crud.DataSupport.save(DataSupport.java:984)
W/System.err﹕ at com.hanyou.ulock.ui.RoomActivity.transform(RoomActivity.java:408)
W/System.err﹕ at com.hanyou.ulock.ui.RoomActivity$3.onReceive(RoomActivity.java:297)

Here is the litepal.xml:

Here is the LockLog.java:
public class LockLog extends DataSupport {
private String type_no;
private String open_type;
private String open_time;
private String valid_time;
...

Here is the AppContext.java:
public class AppContext extends LitePalApplication {
...

And here is the code:
LockLog log = new LockLog();
log.setOpen_type(type);
log.setOpen_time(openTime);
log.setType_no(typeNo);
log.setValid_time(validTime);
PrintUtil.println("SAVE:" + log.save());
...

bollen field set(false) then updateAll() seems does not work.

A class User has a private field bollen isLastUse and two method setLastUse() isLastUse()

User user = new User();
user.setLastUse(true);
user.updateAll();
-----this above codes effect-----

user.setLastUes(false);
user.upadteAll();
-------has no effect-------

Application problems

Hi, What if i already has a customized Application, "MyCompanyApplication", to inherit?
public class MyApplication extends MyCompanyApplication{

}

and the MyCompanyApplication is from .jar, and i can not do anything about it. What should i do if i still want to use LitePal

How can a Blob object be used?

Hi,

Thank you for such a great tool but I couldnt use Blob for column type. Am I wrong or you just missed this feature?

Kindest regards,
Nessus.

can set minSdkVersion to 8?

公司项目需要,主攻一些二三线城市,目前一些低端机的minSdkVersion还有可能为8, 所以项目组决定还是兼容一下,从咱们的功能来看,minSdkVersion降级为8,应该没有什么问题吧,静候佳音!

数据修改的bug

News news = new News();
news.setReadCount(0);
news.update(1);
这种方式是更新不了readCount的
ContentValue value = new ContentValue();
value.put("readCount", 0);
DataSupport.update(News.class, 1);
这种是可以更新的,看了下源码没发现什么问题,求解

SQLiteException: Expression tree is too large (maximum depth 1000)

android.database.sqlite.SQLiteException: Expression tree is too large (maximum depth 1000)

两个类,具有以下关联:
public class Track extends DataSupport {
private long id;
private double longitude;
private double latitude;

...

}

public class Journey extends DataSupport {
private long id;
private double distance;
private List trackList = new ArrayList();

...

}

当 Track 表数据较大时,进行以下操作会有异常:
journey.getTrackList.add(track);
journey.save;

所以,我如果要存入一条 track 记录且与 某一条 journey 记录关联起来,什么方法比较合适?
目前我采用的方法是在 track 表中增加 journey_id 的方法,同时去掉直接关联的代码。

model中继承来的属性无法存入数据库

父类继承DataSupport,子类继承父类,但是只有private的属性能存入数据库。
若父类和子类的属性都是private,将子类实例存入数据库后,保存的只有子类自己的private属性;

publish to maven central?

I can't find LitePal in Maven Central Repositories.Could it be published to maven? it's helpful for gradle developers.

Integer fields errors

When model has Integer fields, "DataSupport.find()" will got this error:
E/AndroidRuntime(24722): Caused by: org.litepal.exceptions.DataSupportException: getInteger

打包混淆配置

打包混淆的时候报错,希望能增加一个打包混淆配置说明

I have a try to make table association ,and type is more with more and I have a quetion

Now I have two table Note and Tag
Note
string content;
List tagList;

Tag
String tagName;
List noteList;

after run app
in local storage the LitePal will help me create three tables. expect note tag table and it also created note_tag successfully

Now the queston is coming !
when I create Note entity like this

Note note = new Note();
note.setContent("LitePa; is so nice");

ListtagList = getTagList();
note.setTagList(tagList);

note.save();

after operation . the note will be saved note table,but in note_tag table , it have't nothing record, I think it will be add some record , is it need inset record to note_tag table by own code ?

如何支持索引?

对于有些应用,例如微信,可能数据量比较大,在查询聊天消息时,会用到索引,源代码中全局grep了一把,没有找到create.*index的语句,判断目前是否不支持索引?

LitePalApplication 这个必须继承有点难为人啊

LitePalApplication中

'''public static Context getContext() {
if (mContext == null) {
throw new GlobalException(GlobalException.APPLICATION_CONTEXT_IS_NULL);
}
return mContext;
}

@Override
public void onLowMemory() {
    super.onLowMemory();
    mContext = getApplicationContext();
}'''

就这一个功能还要用一个Application,太浪费了。
为嘛不要自己去set呢

How to put this into a new thread

我想要创建一个线程,然后在线程中批量添加数据。
但是我发现,我怎么做都会阻塞主线程,能帮我解决这个问题么。

Update data:不能从其他类型更新到0

对以下代码:
Video video = new Video();
video.setCategory(targetCategory);
video.update(id);

targetCategory是int,如果targetCategory==0,则无法从原有的category更新到0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.