在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);