【问题标题】:How do you store a collection of Strings in SQLite on Android?如何在 Android 上的 SQLite 中存储字符串集合?
【发布时间】:2011-08-08 19:30:49
【问题描述】:

我对在应用程序中使用数据库非常缺乏经验,所以我需要一些指导。

我有一个 Java 对象,其中包含多个原始字段,以及对字符串和 ArrayList 对象的多个引用。原语和字符串很好地映射到可用的 SQLite 字段,但我不确定如何保存 ArrayLists。

我有两个想法,一个是序列化 ArrayLists 并将它们存储在一个文本字段中,另一个是有一个列指向一个具有 arity 1 的表,我可以在其中存储单个字符串,但我不确定如何在android中实现这一点。我对不同的方法持开放态度,但我不知道如何使用 SQLite 在 java 中实现后者,所以一个解决方案会很可爱。谢谢。

【问题讨论】:

    标签: java android database sqlite


    【解决方案1】:

    在不了解更多细节的情况下,我可以说教科书的做法是为数组列表创建第二张表,然后将主记录的 id 包含在数组列表中。

    例如,假设您的对象包含

    String name;
    int age;
    ArrayList<String> hobbies;
    

    你会创建这样的表:

    create table person (personid int, name varchar(30), age int);
    create table hobby (hobbyid int, personid int, description varchar(30));
    

    那么您的数据可能如下所示:

    Person
    11   Bob    18
    12   Sally  68
    13   Ford   42
    
    Hobby
    21   11   fishing
    22   11   hunting
    23   12   needlepoint
    24   12   rock-climbing
    25   13   hitch-hiking   
    

    要获取任何人的爱好列表,您可以使用如下查询:

    select person.name, hobby.description
    from person
    join hobby on person.personid=hobby.personid
    

    【讨论】:

      【解决方案2】:

      通常(据我所知)如果您有一个对象,该对象本身包含其他对象的列表,那将是一对多(或可能是多对多)的关系。要存储这些数据,您需要使用另一个表。在另一个表中,您将拥有对象的主键,然后是引用它所属的父对象的外键。请参阅this 链接以获得更好的解释。

      例子:

      CREATE TABLE User (
          _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
          name TEXT
      
      );
      
      CREATE TABLE UserPicture(
          _id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
          userId INTEGER,
          path TEXT
      
      FOREIGN KEY(userId) REFERENCES User(_id)
      );
      

      现在假设您有一个用户对象,其中包含一个“用户图片列表”,当您保存到数据库时 将要遍历每张图片并将每张图片插入到 UserPicture 表中,使用 userId 作为返回 User 表的链接。

      在多对多关系的实例中,每个对象都会有一个包含其子对象的列表。 一个更好的例子是会员/角色系统。用户将有一个角色列表和一个角色 会有一个用户列表,因为一个用户(通常)可以有多个角色,一个角色当然可以有 多个用户。这将只需要我认为它是所谓的连接表。 UserInRole 将有两列,UserID 和 RoleID,以表明用户 X 属于角色 Y。

      至于如何实现它,请搜索“Android sqlite 教程”。 Herehere 是两个链接,其中包含有关如何设置 sqlite android 数据库应用程序的教程。

      【讨论】:

      • 我很快就会发布一个例子。
      • 无意冒犯,但在path TEXT 之后缺少,
      【解决方案3】:

      你可以使用这个库, 在字符串列表上使用注释“@SaveList”

      //To save
      EscapeSQLBoiler.getEscapeSQLBoiler(this).saveMyList("UniqueKey", strings);
      
      //to get
      strings = EscapeSQLBoiler.getEscapeSQLBoiler(this).giveMyListSavedInKey(UniqueKey);
      

      库路径

      https://dl.bintray.com/bipinayetra/maven/com/bipinayetra/save-processor/
      
      https://dl.bintray.com/bipinayetra/maven/com/bipinayetra/save-annotation/
      

      下载

      dependencies {
          annotationProcessor 'com.bipinayetra:save-processor:1.0.0'
          implementation 'com.bipinayetra:save-annotation:1.0.0'
      }
      

      要使用保存列表库,请将插件添加到您的构建脚本中:

      allprojects {
          repositories {
              maven {
                  url "https://dl.bintray.com/bipinayetra/maven"
              }
          }
      }
      

      您也可以在博客上查看此信息

      https://www.bipinayetra.com/products/2018/12/25/save-yourself-from-saving.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-25
        • 2012-10-09
        • 2016-05-22
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 2016-08-21
        • 1970-01-01
        相关资源
        最近更新 更多