2013-05-17 41 views
38

làm cách nào để lưu trữ một đối tượng JSON trong cơ sở dữ liệu SQLite? Cách chính xác là gì?Cách lưu trữ đối tượng JSON trong cơ sở dữ liệu SQLite

một nơi là cột loại blob. nếu tôi có thể chuyển đổi các đối tượng JSON vào mảng byte và sử dụng FileOutputStream

ý tưởng khác là để lưu trữ trong một cột văn bản như là một String

import org.json.JSONObject; 

JSONObject jsonObject; 

public void createJSONObject(Fields fields) { 
    jsonObject = new JSONObject(); 

    try { 
     jsonObject.put("storedValue1", fields.storedValue1); 
     jsonObject.put("storedValue2", fields.storedValue2); 
     jsonObject.put("storedValue3", fields.storedValue3); 
     jsonObject.put("storedValue4", fields.storedValue4); 
     jsonObject.put("storedValue5", fields.storedValue5); 
     jsonObject.put("storedValue6", fields.storedValue6); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 
+3

[JSON là * biểu diễn văn bản dữ liệu *] (http://json.org). Vì vậy, hãy lưu nó trong một TEXT cột/loại ái lực. Mã hóa nó như là một BLOB chỉ làm cho thêm công việc/đau - không làm điều đó! Tất nhiên, * nhận JSON thực tế * từ 'JSONObject' (tức là * không * JSON). Điều đó có thể được thực hiện với ['jsonObject.toString()'] (http://www.json.org/javadoc/org/json/JSONObject.html#toString()). – user2246674

+0

nếu Sqlite không bắt buộc sử dụng thì gợi ý của tôi là viết tệp File.txt và lưu toàn bộ phản hồi trong tệp và đọc nó khi cần –

Trả lời

56

Chuyển đổi JSONObject thành chuỗi và lưu dưới dạng TEXT/VARCHAR. Trong khi lấy cùng một cột chuyển đổi chuỗi thành JSONObject.

Ví dụ

Viết vào DB

String stringToBeInserted = jsonObject.toString(); 
//and insert this string into DB 

Đọc từ DB

String json = Read_column_value_logic_here 
JSONObject jsonObject = new JSONObject(json); 
+0

Bạn có biết bất kỳ vấn đề hiệu suất nào bằng cách chèn nó như thế không? – JohnAndrews

+0

@JohnAndrews no. Nếu bạn tìm thấy, xin vui lòng cập nhật ở đây :) –

+0

Sẽ làm. Tôi đang sử dụng phương pháp đó để lưu trữ các chuỗi hình ảnh được chuyển đổi base64 ... vì vậy sẽ thấy điều gì xảy ra – JohnAndrews

2

Không có kiểu dữ liệu cho điều đó .. Bạn cần lưu trữ nó như VARCHAR hoặc TEXT chỉ .. jsonObject.toString();

18

Một giải pháp thay thế có thể là sử dụng phần mở rộng JSON mới cho SQLite. Tôi chỉ mới bắt gặp chính điều này: https://www.sqlite.org/json1.html Điều này sẽ cho phép bạn thực hiện một mức truy vấn JSON được lưu trữ nhất định. Nếu bạn sử dụng VARCHAR hoặc TEXT để lưu trữ một chuỗi JSON, bạn sẽ không có khả năng truy vấn nó. Đây là một bài viết tuyệt vời cho thấy cách sử dụng của nó (trong python) http://charlesleifer.com/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/

+0

Điều này thật tuyệt vời! – aalaap

+0

Và đây là cách có thể thực hiện Android bằng NDK: https://www.sqlite.org/android/doc/trunk/www/index.wiki –

0

Đó là một câu hỏi khá cũ, nhưng https://github.com/requery/sqlite-android thậm chí cho phép bạn truy vấn các trường JSON (và mảng trong đó, tôi đã thử nó và đang sử dụng nó). Trước đó tôi chỉ lưu các chuỗi JSON vào cột TEXT. Hỗ trợ FTS3, FTS4, & JSON1

Các vấn đề liên quan