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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Q&A

解決済

1回答

4852閲覧

onCreateの外でデータベースのデータを取得する指示をしたい

Haru_T

総合スコア34

SQLite

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/10/05 08:46

編集2016/10/05 08:49

英単語帳アプリを作っています。
SubActivityにFragmentを1つ用意し、そこに用意したSQLiteファイルのデータベースから取得したデータを表示したいのです。
[やりたい処理]
・一旦データベースで取得した値をArrayListに入れる
・Fragment上で表示するために、onCreateの外にListを作る構文を書く
しかし、文法的にエラーはないものの、構文上に問題があるのか、ArrayList(WordListという名前)を作るところでエラーとなってしまいます。
[分からないこと]
・onCreate上に残しておくべきものが合っているのかどうか
・外に出さないといけないといけないものがなんなのか
・ほかに足りないものがあるのかどうか

java

1package com.example.wordcard2; 2 3import android.content.Intent; 4 5import android.database.Cursor; 6import android.database.sqlite.SQLiteDatabase; 7import android.os.Bundle; 8import android.support.v4.app.FragmentActivity; 9import android.support.v4.app.FragmentManager; 10import android.support.v4.util.SparseArrayCompat; 11import android.support.v4.view.ViewPager; 12import android.util.Log; 13import android.view.View; 14import android.widget.ArrayAdapter; 15import android.widget.ListView; 16 17import java.util.ArrayList; 18 19public class SubActivity extends FragmentActivity { 20 21 private DataBaseHelper dbhelper = null; 22 private ViewPager mViewPager; 23 private ArrayList<SparseArrayCompat<String>> wList; 24 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_sub); 30 mViewPager = (ViewPager) findViewById(R.id.view_pager); 31 32 // PagerAdapter をつくる 33 FragmentManager fm = getSupportFragmentManager(); 34 PagerAdapter adapter = new PagerAdapter(fm); 35 36 wList = getWordList(); /*40行目*/ 37 adapter.addAll(wList); 38 39 // ViewPager にセットする 40 mViewPager.setAdapter(adapter); 41 42 dbhelper = new DataBaseHelper(this); 43 } 44 45 private ArrayList<SparseArrayCompat<String>> getWordList() { 46 ArrayList<SparseArrayCompat<String>> data = new ArrayList<SparseArrayCompat<String>>(); 47 48 SQLiteDatabase databaseObject = dbhelper.getReadableDatabase(); /*80行目*/ 49 50 SparseArrayCompat<String> word = new SparseArrayCompat<String>(); 51 String query = "SELECT * " + "FROM WordData"; 52 Log.d("query", "query = " + query); 53 54 Cursor cursor = databaseObject.rawQuery(query, null); 55 cursor.moveToFirst(); 56 for (int i = 0; i < cursor.getCount(); i++) { 57 word.append(0, cursor.getString(0)); 58 word.append(1, "【" + cursor.getString(1) + cursor.getString(2) + "】"); 59 word.append(2, cursor.getString(3)); 60 word.append(3, cursor.getString(4)); 61 word.append(4, cursor.getString(5)); 62 word.append(5, cursor.getString(6)); 63 cursor.moveToNext(); 64 } 65 66 cursor.close(); 67 data.add(word); 68 69 databaseObject.close(); 70 return data; 71 } 72}

エラーは下記の通りです。
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase com.example.wordcard2.DataBaseHelper.getReadableDatabase()' on a null object reference
at com.example.wordcard2.SubActivity.getWordList(SubActivity.java:80)
at com.example.wordcard2.SubActivity.onCreate(SubActivity.java:40)

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずは、エラーメッセージの内容をよく確認すると良いです。

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase com.example.wordcard2.DataBaseHelper.getReadableDatabase()' on a null object reference

getReadableDatabase()を実行しているところで何かがnullだからNullPointerExceptionが発生したという事が分かります。
掲載されたソースの中では、getReadableDatabase()を実行しているのはgetWordList()の中なので特定は簡単です。

java

1 SQLiteDatabase databaseObject = dbhelper.getReadableDatabase();

この時点でdbhelperがnullになっているからエラーになっているという事です。
理由は、dbhelperを初期化する前にgetWordList()を実行してしまっているので、dbhelperがnullのままだからです。

java

1protected void onCreate(Bundle savedInstanceState) { 2 ... 3 wList = getWordList(); /*40行目*/ 4 ... 5 dbhelper = new DataBaseHelper(this); 6}

つまり、getWordList()より前にdbhelperを初期化すれば良いはずです。

java

1protected void onCreate(Bundle savedInstanceState) { 2 ... 3 dbhelper = new DataBaseHelper(this); 4 ... 5 wList = getWordList(); 6}

投稿2016/10/05 09:03

mingos

総合スコア4025

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

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

Haru_T

2016/10/06 08:08

丁寧に回答いただきありがとうございます。とても分かりやすく、納得しました。 しかし初期化の処理とListのgetの処理を入れ替えただけでは、 他の間違いか不足点があるのかうまくいきませんでした。ちなみにエラー内容は The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 0, found: 1 Pager id: com.example.wordcard2:id/view_pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.example.wordcard2.PagerAdapter でした。その内容について今一度調べてみようと思います。
mingos

2016/10/06 08:24

掲載されたソースだけではこちらで動作確認できないので、推測になってしまいますが、 エラーの内容からすると、どこかでPagerAdapterのnotifyDataSetChanged()を呼び出す必要があるようです。 間違っているかもしれませんが、とりあえず予想ではViewPagerにsetAdapter()する前にnotifyDataSetChanged()を呼び出してみてはどうでしょうか? ```java adapter.addAll(wList); adapter.notifyDataSetChanged(); mViewPager.setAdapter(adapter); ```
Haru_T

2016/10/06 08:36

データベースを繋ぐのに一生懸命でPagerAdapterのところを見落としていたのかもしれません。指摘してくださったnotifyDataSetChanged()のところについて調べて呼び出してみます。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問