在SugarORM中持久存在物体

我有一本书课:

public class Book extends SugarRecord { private String mBookName; private String mAuthorName; private List mPageList; public Book() { } public Book(String bookname, String authorName) { mBookName = bookname; mAuthorName = authorName; mPageList = new ArrayList(); } public String getAuthorName() { return mAuthorName; } public void setAuthorName(String authorName) { mAuthorName = authorName; } public String getBookName() { return mBookName; } public void setBookName(String bookName) { mBookName = bookName; } public void addPage(Page page) { mPageList.add(page); } } 

和Page类:

 public class Page extends SugarRecord { private String mText; public Page() { } public Page(String text) { mText = text; } public String getText() { return mText; } public void setText(String text) { mText = text; } } 

我正在测试它:

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Book book = new Book("Some Book Title", "John Doe"); Page page1 = new Page("Once upon a time there was a very lonely bunny who wanted some friends."); Page page2 = new Page("So he found some friends, and everyone was happy."); Page page3 = new Page("The end!"); book.addPage(page1); book.addPage(page2); book.addPage(page3); book.save(); } } 

但它没有按预期工作。 它试图使用这个.schema使mPageList成为自己的列:

 CREATE TABLE BOOK ( ID INTEGER PRIMARY KEY AUTOINCREMENT , M_AUTHOR_NAME TEXT, M_BOOK_NAME TEXT, M_PAGE_LIST ); 

我真正喜欢它的做法是不将列表视为自己的列,而是将Pages保存到PAGE表中,并使用引用此Book类的其他ID(因此我期待的是ID, BOOK_ID, M_TEXT )。 简而言之,通过嵌套子对象级联的持久性操作。

可以在SugarORM中完成吗?

SugarORM上没有List 。 你可以管理它的方式有点棘手。 简而言之,您可以管理1到N个关系,颠倒。 看一下下一个例子让我们假设一个Team对象可以有N个Person对象。 通常,您将以这种方式在类Team中使用List

 public class Team { String teamName; List ... } public class Person { String name; String rol; ... } 

嗯,在SugarORM上是不可能的。 但是你可以在Team中添加Team作为属性,因此,任何Person的实例都应该包含对它所属的Team对象的引用。

 public class Team extends SugarRecord { String teamName; ... } public class Person extends SugarRecord { String name; String rol; Team team; ... } 

然后,您可以使用方法(在Team类中)从Team获取所有Person对象,如:

 public class Team extends SugarRecord { String teamName; ... public List getPersons(){ return Person.find(Person.class, "id = ?", String.valueOf(this.getId())); } } 

因此,您可以管理1到N个关系,但是您无法管理N到M的关系(属于多个Team对象的人员)。 IMO管理它的方法是使用关联实体将N分割为M到两个1到N的关系。 正如您所看到的,SugarORM不允许您只考虑对象,但是,任何情况下您都可以节省大量的锅炉板编码。

没有ORM数据库(SugarORm,DBFLow等)支持List列。 如您所知,sql也没有这种数据类型。

这就是你得到这个错误的原因。 如果你问我如何将列表保存到ORM。 我用Gson。

将Pagelist声明为字符串。

String Pagelist;

在将其保存到数据库之前,使用帮助Gson库将其转换为Json字符串。

 Gson gson = new Gson(); String value = gson.toJson(your_page_list); 

从数据库检索时使用Gson将json字符串转换为List。

 List page_list; Type typeIndicatorForGson = new TypeToken>() {}.getType(); Gson myGson = new Gson(); page_list = myGson.fromJson(page_json_data_from_database, typeIndicatorForGson);