質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1359閲覧

JSONデータをSQLiteに保存しようとするとクラッシュする

Haruto513

総合スコア52

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2020/02/14 01:55

インターネット経由でJSONデータを取得し、Sqliteに保存するという処理を実現したいと考えています。

https://api.myjson.com/bins/mz57k
画像をこのツール→https://lab.syncer.jp/Tool/Base64-encode/を使ってBase64文字列に変換しており、imageにその文字列が入ったJSONをダウンロードし、Sqliteに保存、後で取り出して画像として扱うのが目標です。
しかし、Sqliteに保存するところで、アプリがクラッシュしてしまいます。

Kotlin

1 2 private inner class DataDownload: AsyncTask<String,String,String>() { 3 override fun doInBackground(vararg params: String?): String { 4 val urlSt = "https://api.myjson.com/bins/mz57k" 5 val url = URL(urlSt) 6 val con = url.openConnection() as HttpsURLConnection 7 con.requestMethod = "GET" 8 var result = "" 9 var inst: InputStream? = null 10 con.connect() 11 inst = con.inputStream 12 val sb = StringBuilder() 13 val reader = BufferedReader(InputStreamReader(inst!!)) 14 var line = reader.readLine() 15 while (line != null) { 16 sb.append(line) 17 line = reader.readLine() 18 } 19 reader.close() 20 result = sb.toString() 21 con.disconnect() 22 inst.close() 23 return result 24 } 25 26 override fun onPostExecute(result: String?) { 27 super.onPostExecute(result) 28 var rootJSON = JSONObject(result!!) 29 val id = rootJSON["ID"].toString() 30 val name = rootJSON["name"].toString() 31 val image = rootJSON["image"].toString().toByteArray() 32 val db = jsonDownloadDatabaseHelper(applicationContext).writableDatabase 33 val value = ContentValues() 34 value.put("_id", id) 35 value.put("name", name) 36 value.put("image", image) 37 db.insert("dataTable",null, value) 38 } 39 } 40 41

このクラスをonCreate()でexecute()しています。

すると、数秒後にアプリがクラッシュし、以下のようなエラーが出てきます。

E/AndroidRuntime: FATAL EXCEPTION: main Process: jp.wings.nikkeibp.imagedowload, PID: 3103 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)  Caused by: org.json.JSONException: Value [{"ID":"001","name":"桜","image":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBkAGQAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz //...以下大量のbase64文字列

org.json.JSONExceptionとあるので、onPostExecute()の中の処理に問題があるのかと予想していますが、調べてもまだ腑に落ちる原因は見つけられずにいます。
ご教示頂けると助かります。宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JSONException なので SQLite にアクセスする前の JSON のパーズでエラーになってます。

[{"ID":"001","name":"桜","image":"data:image/jpeg;base64,..."}]

JSON の [] は配列、{} はオブジェクトを意味します。
つまり、この JSON は配列の中にオブジェクト 1 個だけあるので、

Kotlin

1 override fun onPostExecute(result: String?) { 2 super.onPostExecute(result) 3 var array = JSONArray(result!!) 4 var rootJSON = array[0] 5 // 以下略

とすれば良いと思います。

投稿2020/02/14 05:28

hoshi-takanori

総合スコア7893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Haruto513

2020/02/14 06:20

val jsonArray = JSONArray(result!!) val rootJson = JSONObject(jsonArray[0].toString()) val id = rootJson["ID"].toString() val name = rootJson["name"].toString() val image = rootJson["image"].toString() val imagetext = image.substring(image.indexOf(",") + 1) val db = jsonDownloadDatabaseHelper(applicationContext).writableDatabase val value = ContentValues() value.put("_id", id) value.put("name", name) value.put("image", imagetext) db.insert("dataTable",null, value) と書き直したところ、無事画像が保存されました!教えてくださりありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問