【问题标题】:SQLite query with byte[] WHERE clause带有 byte[] WHERE 子句的 SQLite 查询
【发布时间】:2012-01-23 09:25:13
【问题描述】:

从 Android SQLite 数据库的角度来看 - 我有一个表,它有一个 BLOB 类型的字段,然后我想根据这个 BLOB 字段查询这个表的内容。

我可以使用ContentValues 插入我的 BLOB 字段并使用以下方法检索它:

cursor.getBlob(0)// index

我只是不知道如何根据这个 BLOB 字段查询这个表的内容,也没有发现这个问题。

【问题讨论】:

    标签: java android sql blob


    【解决方案1】:

    您无法查询 blob 的(文本?二进制?其他?)内容。

    如果你看,你会看到内容是十六进制的:

    示例:X'53514C697465'。

    建议:

    创建一个新的文本列,例如“blob_index”。您可以搜索“索引”列,然后获取 blob。

    或者,只需将数据存储为“文本”。

    【讨论】:

      【解决方案2】:

      我发现您可以对 blob 进行查询。需要在查询中使用 hex() 函数。

      例如,我在我的数据库行中使用 UUID 作为唯一键,我可以在本地生成它并且仍然确保在服务器上的唯一性。

      CREATE TABLE example (_ID INTEGER PRIMARY KEY AUTOINCREMENT,
                            uuid BLOB NON NULL UNIQUE,
                            ...)
      

      当插入数据时,以下工作:

      final ContentValues values = new ContentValues(4);
      values.put(Contract.Line.COL_UUID,
                 UuidFactory.toBlob(uuid));
      

      给定一个查询 URI,格式为:

      content://package.example.com/example/uuid/11112222-3333-0444-0555-666677778888
      

      查询变为:

      final SQLiteDatabase db = mHelper.getReadableDatabase();
      return db.query(table, projection,
                      "hex(uuid) = ?",
                      new String[] { UuidFactory.toHex(uri.getLastPathSegment()) },
                      null, null, null, null);
      

      UuidFactory(还包含生成新 UUID 的代码)中定义了以下静态函数:

      @NonNull
      public static String toHex(@NonNull final UUID uuid) {
          return String.format("%016X%016X",
                              uuid.getMostSignificantBits(),
                              uuid.getLeastSignificantBits());
      }
      
      @NonNull
      public static String toHex(@NonNull final String uuid) {
          return toHex(UUID.fromString(uuid));
      }
      
      @NonNull
      public static byte[] toBlob(@NonNull final UUID uuid) {
          final ByteBuffer buf = ByteBuffer.allocate(16);
          buf.putLong(uuid.getMostSignificantBits());
          buf.putLong(uuid.getLeastSignificantBits());
          return buf.array();
      }
      

      为了完整性:

      @NonNull
      public static UUID fromBlob(@NonNull final byte[] array) {
          final ByteBuffer buf = ByteBuffer.allocate(16);
          buf.mark();
          buf.put(array);
          buf.reset();
          final long msb = buf.getLong();
          final long lsb = buf.getLong();
          return new UUID(msb, lsb);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多