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

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

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

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

Android Studio

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

Q&A

解決済

1回答

3927閲覧

Android)SQliteでSQLファイルのInsertが1行しか反映されない

navesanta

総合スコア198

Android

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

Android Studio

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

0グッド

0クリップ

投稿2017/05/15 08:23

編集2017/05/15 09:10

assetsフォルダにsqlフォルダを作ってそこにSQLファイル(newtest.sql)を入れました。SQliteを使ってローカルフォルダにデータベース(open.db)を作り先程のnewtest.sqlをInsertしました。

2行のinsertデータがあるのですが結果はなぜか1行しか反映されません。adb shellでみても同じ結果です。どこに問題があるのでしょうか?教えて下さい。

ちなみにsqlファイル(newtest.sql)の作り方はエディタテキスト(秀丸)で作成してUTF-8でテキストファイルで保存してその後拡張子を.sqlに手動で変更して作成しています。

環境 Android Studio 2.2.3
OS mac
sqlite3

DatabaseOpenHelper.java

public class DatabaseOpenHelper extends SQLiteOpenHelper { private static final String DB_NAME = "open.db"; //データベース名 private static final int DB_VERSION = 1; //データベースのバージョン private final Context mContext; //コンテキスト public static final String CREATE_TABLE = "create table " + WordContract.Words.TABLE_NAME + " (" + WordContract.Words._ID + " integer primary key autoincrement, " + WordContract.Words.COL_WORD + " text," + WordContract.Words.COL_DESCR + " text)"; //コンストラクタ public DatabaseOpenHelper(Context context){ super(context, DB_NAME, null, DB_VERSION); this.mContext = context; } //データベースが作成された時に呼ばれる //assets/sql内に定義されているsqlを実行します @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(CREATE_TABLE); execSql(db,"sql"); }catch (IOException e){ e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } //引数に指定したassetsフォルダ内のsqlを実行する private void execSql(SQLiteDatabase db, String assetsDir) throws IOException { AssetManager as = mContext.getResources().getAssets(); try{ String files[] = as.list(assetsDir); for (int i = 0; i < files.length; i++){ String str = readFile(as.open(assetsDir + "/" + files[i])); for (String sql: str.split("/")){ db.execSQL(sql); } } }catch (IOException e){ e.printStackTrace(); } } //ファイルから文字列を読み込む private String readFile(InputStream is) throws IOException{ BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(is,"UTF-8")); StringBuilder sb = new StringBuilder(); String str; while ((str = br.readLine()) != null){ sb.append(str + "€n"); } return sb.toString(); }finally { if (br != null)br.close(); } } }

MainActivity.java

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DatabaseOpenHelper openHelper = new DatabaseOpenHelper(this); SQLiteDatabase database = openHelper.getWritableDatabase(); //処理 Cursor cursor = null; cursor = database.query( WordContract.Words.TABLE_NAME, null, null, null, null, null, null ); Log.v("UAA", "Count:" + cursor.getCount()); while (cursor.moveToNext()){ int id = cursor.getColumnIndex(WordContract.Words._ID); String name = cursor.getString(cursor.getColumnIndex(WordContract.Words.COL_WORD)); String desc = cursor.getString(cursor.getColumnIndex(WordContract.Words.COL_DESCR)); Log.v("UAA", "Id:" + id + " Word:" + name + " Desk:" + desc); } cursor.close(); database.close(); } }

WordContract.java

public final class WordContract { public WordContract(){} public static abstract class Words implements BaseColumns{ public static final String TABLE_NAME = "word"; public static final String COL_WORD = "word"; public static final String COL_DESCR = "original_description"; } }

newtest.sql

INSERT INTO word (word,original_description) VALUES ('アイコン','パソコン操作画面のデータファイルや処理を小さな画像でわかりやすく表現した絵や記号のこと。'); INSERT INTO word (word,original_description) VALUES ('アップデート','パソコンでは不具合の修正、小さな機能向上、機能追加などソフトウェアの小規模な更新のこと。またそのためのソフトウェア部品のこと。€'); ```希望している結果(LogCat) Count:2 Id:0 Word:アイコン Desk:パソコン操作画面のデータファイルや処理を小さな画像でわかりやすく表現し・・・ Id:1 Word:アップデート Desk:パソコンでは不具合の修正、小さな機能向上、機能追加などソフトウェ・・・ 実際の結果(LogCat)※1行しか反映されない Count:1 Id:0 Word:アイコン Desk:パソコン操作画面のデータファイルや処理を小さな画像でわかりやすく表現し・・・

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

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

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

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

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

guest

回答1

0

ベストアンサー

db.execSQLに渡している文字列を全てログ出力してください。

また、コードはファイル単位で分割してください。

投稿2017/05/15 08:58

yona

総合スコア18155

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

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

navesanta

2017/05/15 09:20

>コードはファイル単位で分割してください。 失礼しました。分割しました。 >db.execSQLに渡している文字列を全てログ出力してください。 どこの部分をログ出力すれば良いのかよくわからなかったので ログキャットの出力を全部下記に記載します。 05-15 18:11:51.332 2517-2517/? I/art: Not late-enabling -Xcheck:jni (already on) 05-15 18:11:51.332 2517-2517/? W/art: Unexpected CPU variant for X86 using defaults: x86 05-15 18:11:51.469 2517-2524/? E/art: Failed sending reply to debugger: Broken pipe 05-15 18:11:51.470 2517-2524/? I/art: Debugger is no longer active 05-15 18:11:51.470 2517-2524/? I/art: Starting a blocking GC Instrumentation 05-15 18:11:51.609 2517-2517/? W/System: ClassLoader referenced unknown path: /data/app/com.○○○.opendbapp-2/lib/x86 05-15 18:11:51.635 2517-2517/? I/InstantRun: starting instant run server: is main process 05-15 18:11:51.813 2517-2517/? W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable 05-15 18:11:52.062 2517-2517/? V/UAA: Count:1 05-15 18:11:52.062 2517-2517/? V/UAA: Id:0 Word:アイコン Desk:パソコン操作画面のデータファイルや処理を小さな画像でわかりやすく表現した絵や記号のこと。 05-15 18:11:52.205 2517-2555/? I/OpenGLRenderer: Initialized EGL, version 1.4 05-15 18:11:52.206 2517-2555/? D/OpenGLRenderer: Swap behavior 1 05-15 18:11:52.206 2517-2555/? W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without... 05-15 18:11:52.206 2517-2555/? D/OpenGLRenderer: Swap behavior 0 05-15 18:11:52.267 2517-2517/? W/art: Before Android 4.1, method int android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
yona

2017/05/15 10:35

DatabaseOpenHelperの中にあるdb.execSQLです。
navesanta

2017/05/16 02:49

>DatabaseOpenHelperの中にあるdb.execSQLです。 了解しました。下記です。CREATとINSERTです。なぜかINSERTの2行の間に空間があるのが気になりますが・・・そのままのログです。よろしくお願いします。 05-16 11:41:29.305 26573-26573/com.○○○.opendbapp D/UAA:cr: create table word (_id integer primary key autoincrement, word text,original_description text) 05-16 11:41:29.309 26573-26573/com.○○○.opendbapp D/UAA:sql: INSERT INTO word (word,original_description) VALUES ('アイコン','パソコン操作画面のデータファイルや処理を小さな画像でわかりやすく表現した絵や記号のこと。'); INSERT INTO word (word,original_description) VALUES ('アップデート','パソコンでは不具合の修正、小さな機能向上、機能追加などソフトウェアの小規模な更新のこと。またそのためのソフトウェア部品のこと。€');
Kmassa

2017/05/16 05:26

横から失礼します。複数回呼ぶようには組まれてますね。ただし、readFileでは各行の区切りを"\n"、execSqlでは"/"と整合性が取れていませんが。どちらかに統一すれば行毎にdb.execSQLが呼ばれると思います。
yona

2017/05/16 06:04

ログ出力だけで判断してました、ごめんなさい。 readFileがList<String>を返却するように修正するのといいですね。
navesanta

2017/05/16 07:31

kmassa様 解決しました。全部"\n"にしたところなぜかうまく表示されませんでしたが、全部"/"に変更したところ2行表示されました。ありがとうございました。 yona様 SQL文のログでの出力等参考になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問