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

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

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

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

Q&A

解決済

1回答

1813閲覧

Androidアプリ: SQLiteのデータベースにあるデータを表示する(前回も同じ質問をしました)

aiue

総合スコア36

Android

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

0グッド

0クリップ

投稿2017/09/05 04:34

編集2017/09/07 08:20

PCで先に作ったSQLiteにあるデータベースの情報を表示させるためにはどうすればよろしいでしょうか。
前回も同じような質問をし、回答を頂いてから、androidアプリでデータベースにあるデータを表示するためのプログラムを
組んでみたのですがやはり出来ません。参考に示していただいたURLを読んで自分なりにやってみたところ、そもそもPCで先に作っていた
データベースをアプリに使う為に必要な準備をしていないことが分かり、様々なサイトを見ながら、取り込んだデータベースを
新たに作成したデータベースにコピーしたりしたはずなのですが、動きません。
今現在は、まずLogで確認するためのコードにしていますが、Cursorに値が含まれていないのかc.moveToFirstがfalseになり、、
Logに表示されません。また、c.getStringで取得しようとするとエラーが起きアプリ自体が止まります。
どうすればよろしいでしょうか。
よろしくお願いいたします。

※追記
コピーすることは諦め、onCreateメソッドでデータベースを作成することにしました。
作成時にサンプルデータをいくつか挿入するようにもしました。
データベースの作成には成功したのですが(デバッグでデータベースを作成する処理を通ったことも確認済み)
やはり表示がされませんでした。Cursorに値が入っていない(※nullではない)ことを確認しましたが、なぜ入らないのか分かりません。
何が考えられるでしょうか。度々申し訳ございません。

Java

1public class EmployeeView extends Activity{ 2 3 ListView myListView; 4 5 6 public void onCreate(Bundle bundle){ 7 super.onCreate(bundle); 8 setContentView(R.layout.view); 9 10 //メニューへ戻る押下時 11 findViewById(R.id.button_Menu).setOnClickListener(buttonMenu); 12 13 myListView = findViewById(R.id.myListView); 14 15 DBHelper dbHelper = new DBHelper(EmployeeView.this); 16 SQLiteDatabase db = dbHelper.getReadableDatabase(); 17 Cursor c = db.rawQuery("SELECT * FROM m_employee;",null); 18 if(c.moveToFirst()) { 19 do { 20 Log.v("mytag",c.getString(c.getColumnIndex("emp_code"))); 21 } while (c.moveToNext()); 22 } 23 c.close(); 24 } 25 26 View.OnClickListener buttonMenu = new View.OnClickListener() { 27 @Override 28 public void onClick(View view) { 29 Intent intent = new Intent(getApplicationContext(),Menu.class); 30 startActivity(intent); 31 32 } 33 }; 34}

Java

1public class DBHelper extends SQLiteOpenHelper{ 2 private static String DB_NAME = "emp_sys_db"; 3 private static Context context = null; 4 private static final int DB_Ver = 1; 5 6 public DBHelper(Context context) { 7 super(context,DB_NAME,null,DB_Ver); 8 this.context = context; 9 10 try { 11 if (! databaseExists()) { 12 copyDB(); 13 } 14 } catch (IOException e) { 15 e.printStackTrace(); 16 } 17 } 18 19 @Override 20 public void onCreate(SQLiteDatabase db) { 21 } 22 23 @Override 24 public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { 25 try { 26 copyDB(); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } 30 } 31 32 //dbファイルの存在チェック 33 private boolean databaseExists() { 34 File dbFile = new File(this.context.getFilesDir().getParent()+"/databases/"+DB_NAME); 35 36 return dbFile.exists(); 37 } 38 39 //assetのdbファイルをコピーする 40 private void copyDB() throws IOException { 41 //コピー先フォルダ 42 String copyFolder = this.context.getFilesDir().getParent()+"/databases/"; 43 44 //フォルダがない場合は作成 45 File checkDirectory = new File(copyFolder); 46 if(! checkDirectory.exists()) { 47 checkDirectory.mkdir(); 48 } 49 50 //ファイルのインプット、アウトプットのセット 51 InputStream in = this.context.getAssets().open(DB_NAME); 52 OutputStream out = new FileOutputStream(copyFolder + DB_NAME); 53 54 //ファイルのコピー 55 byte[] buf = new byte[1024]; 56 int len = 0; 57 while((len = in.read(buf)) > 0) { 58 out.write(buf,0,len); 59 } 60 61 //インプット、アウトプットのクローズ 62 in.close(); 63 out.close(); 64 } 65 66} 67

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記を確認してください。
・assetに置くSQLiteファイルに
テーブルは正しく定義されていますか。
・SQLiteファイルはassetに置いてありますか。
・assetからアプリ内フォルダにコピーするパスは正しいですか。
・コピー時にエラーは発生していませんか。
・select * from sqlite_master;を行い、テーブルが正しく定義されているかを確認してください。

投稿2017/09/05 05:23

yona

総合スコア18155

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

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

aiue

2017/09/05 07:03

DBHelperのcopyDBメソッドが起動されていないみたいで、恐らくdatabaseExists()がtrueで返っているようです。恥ずかしながらこの部分はコピペしただけで理解できていません… また、if文の条件を逆にした場合はcopyDBが実行されましたがやはりLogには出力されていません。
yona

2017/09/05 07:14 編集

「起動されていないみたい」や「恐らく」という不確実な情報はあなたがデバッグを行い確実な情報にしてください。 ブレークポイントを設定して、「処理が想定通りの順序で通るか」、「変数の値は想定通りか」を確認してください。 また、なんとなくif文を逆にするというプログラムの修正はとても危険な行為です。やめましょう。 このようなDB関連やファイルの有無によって処理が変わるときのデバッグは実行するたびにアンインストールして再度実行してください。 あと、私の回答に対してあなたがしたことをコメントに書いてください。
aiue

2017/09/05 07:36

ご指摘ありがとうございます。 確認方法がよく分からなかったのでこれから調べます。申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問