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

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

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

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

Android

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

Q&A

解決済

3回答

3567閲覧

別のクラスで取得したデータをデータベースに保存したい。

toukibi

総合スコア27

Java

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

Android

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

0グッド

0クリップ

投稿2015/10/21 23:15

Androidで周囲のAPをスキャンして表示するプログラムを作っています。
取得したものをデータベースに保存して残すようにしたいです.
下記がそのwifiスキャンのプログラムです。

public class WifiManager04 extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
setListAdapter(adapter);

final WifiManager manager = (WifiManager) getSystemService(WIFI_SERVICE); final Handler handler = new Handler(); final TimerTask timerTask = new TimerTask(){ @Override public void run() { if (manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) { // APをスキャン manager.startScan(); // スキャン結果を取得 List<ScanResult> apList = manager.getScanResults(); final String[] aps = new String[apList.size()]; for (int i = 0; i < apList.size(); i++) { aps[i] = "SSID:" + apList.get(i).SSID + "\n" + apList.get(i).frequency + "MHz " + apList.get(i).level + "dBm"; } handler.post(new Runnable() { @Override public void run() { adapter.clear(); adapter.addAll(aps); adapter.notifyDataSetChanged(); } }); } } }; new Thread(new Runnable() { @Override public void run() { new Timer(true).schedule(timerTask, 0, 1000); } }).start(); }

できているかどうかわかりませんがデータベースの形を作りましたがここから上記のプログラムをどう持っていけばわかりません。下記がそのデータベースのプログラムです。プログラミング初心者なので分かりにくいかもしれませんが何卒ご教授お願いします。

public class SQLiteDatabase extends Activity {
final static private int DB_VERSION = 1;
final static String DATABASE_NAME = "sqlite_wifi.db";
//databaseに格納する数値の設定
final static String CREATE_TABLE = "create table mytable ( id integer primary key autoincrement, ssid text not null, mhz integer not null );";
final static String DROP_TABLE = "drop table mytable";

static android.database.sqlite.SQLiteDatabase mydb; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_wifi_sample); MySQLiteOpenHelper hlpr = new MySQLiteOpenHelper(getApplicationContext()); mydb = hlpr.getWritableDatabase(); } public static class MySQLiteOpenHelper extends SQLiteOpenHelper { public MySQLiteOpenHelper(Context context) { super(context, DATABASE_NAME, null, DB_VERSION); } @Override public void onCreate(android.database.sqlite.SQLiteDatabase db) { db.execSQL(CREATE_TABLE); //tabelを作成 } @Override public void onUpgrade(android.database.sqlite.SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(DROP_TABLE); //databaseをupdate onCreate(db); } }

}

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

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

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

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

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

guest

回答3

0

ベストアンサー

あなたのSQLiteDatabaseでは,Activityの内部クラスとしてMySQLiteOpenHelperを利用していますね.この書き方は,SQLiteDatabaseからアクセスすることのみを想定しているように見えます.
他の方も書かれている通り,Helperクラスを作成.別なクラス(Activity内など)から利用しましょう.
実用上は↓のような形にすることが多いです.

Java

1public class MySQLiteOpenHelper extends SQLiteOpenHelper { 2 3 /* 順番は自由ですが (private/public) -> static -> final の順に書くことが多いようです */ 4 /* DATABASE, DB が混在しています どちらかに統一すべきでしょう */ 5 private static final int DATABASE_VERSION = 1; 6 private static final String DATABASE_NAME = "sqlite_wifi.db"; 7 8 /* テーブル名やカラム名はデータベースのアクセスに必要なので public にしておきます */ 9 public static final String TABLE_NAME = "mytable"; 10 public static final String COLUMN_ID = "_id"; 11 public static final String COLUMN_SSID = "ssid"; 12 public static final String COLUMN_FREQ = "freq"; // 周波数は frequency という単語があります 13 14 /* 今後 データベースにアクセスする際に "_id" というカラムが必要になるはずです */ 15 /* カラム名には "id" ではなく "_id" を使いましょう */ 16 private static final String CREATE_TABLE = "create table " + TABLE_NAME + "(" + 17 COLUMN_ID + " integer primary key autoincrement," + 18 COLUMN_SSID + " text not null," + 19 COLUMN_FREQ + " integer not null);"; 20 21 private static final String DROP_TABLE = "drop table " + TABLE_NAME; 22 23 public MySQLiteOpenHelper(Context context) { 24 super(context, DATABASE_NAME, null, DATABASE_VERSION); 25 } 26 27 @Override 28 public void onCreate(android.database.sqlite.SQLiteDatabase db) { 29 /* Table を作成する SQL を実行します */ 30 db.execSQL(CREATE_TABLE); 31 } 32 33 @Override 34 public void onUpgrade(android.database.sqlite.SQLiteDatabase db, int oldVersion, int newVersion) { 35 /* Table を消去する SQL を実行します */ 36 db.execSQL(DROP_TABLE); 37 /* onCreate で Table を再生成します */ 38 onCreate(db); 39 } 40}

↓のように使います.

Java

1/* Helper を生成 もちろん context は別途用意 */ 2MySQLiteOpenHelper sqLiteOpenHelper = new MySQLiteOpenHelper(context); 3/* Helper から 読み書き可能な Database を開く */ 4SQLiteDatabase sqLiteDatabase = sqLiteOpenHelper.getWritableDatabase(); 5 6/* database に入れるための形式にする ssid, freq は別途用意 */ 7ContentValues values = new ContentValues(); 8values.put(MySQLiteOpenHelper.COLUMN_SSID, ssid); 9values.put(MySQLiteOpenHelper.COLUMN_FREQ, freq); 10sqLiteDatabase.insert(MySQLiteOpenHelper.TABLE_NAME, null, values); 11 12/* 使い終わったらクローズしましょう */ 13sqLiteDatabase.close(); 14 15/* もちろんデータを書き込む際,毎回開いて閉じてしているのはリソースの面から合理的とはいえません */ 16/* Activity の onCreate 内などで一度だけ getWritableDatabase() を行い */ 17/* それを使い回しましょう */ 18/* onDestroy 内で閉じる処理をかけば十分です */

投稿2015/10/22 07:08

編集2015/10/22 07:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

toukibi

2015/10/22 08:42

丁寧な回答本当にありがとうございます。 Helperクラスの中にWifiManagerクラスを作成し、WifiManagerクラスにHelperを生成する処理を行えばよいのでしょうか? 初歩的な質問ですみません。
退会済みユーザー

退会済みユーザー

2015/10/22 08:44

いいえ.Helperクラスを全く別のクラス(ファイル)として作成してください.WifiManagerから,Helperクラスをインスタンス化しましょう.
toukibi

2015/10/26 17:46

返事が大変遅くなって本当に申し訳ありません! 本当に助かります、ありがとうございます!
toukibi

2015/10/27 20:19

今更の質問で大変恐縮ですが`sqLiteHelper.getWritableDatabase();`は ` public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*Button stopbtn = (Button) findViewById(R.id.stop_id); stopbtn.setOnClickListener((new StopbtnOnClickListener())); Button startbtn = (Button) findViewById(R.id.start_id); startbtn.setOnClickListener(new StartbtnOnClickListener());*/ MySQLiteHelper sqLiteHelper = new MySQLiteHelper(context); SQLiteDatabase sqLiteDatabase = sqLiteHelper.getWritableDatabase(); ` の位置であってますか? できるだけ自分の力でやりたいのですがどうしても動かせなくて...
退会済みユーザー

退会済みユーザー

2015/10/27 20:46

はい.正しいでしょう.MySQLiteHelperを作成するためにContextが必要になるため,必然的にActivity#onCreate()以降で,呼ぶ必要があります. どのように動かないのでしょうか?コメントに書くか,新しく質問してください.
toukibi

2015/10/27 23:08

ありがとうございます。 このようなエラーがでて強制終了してしまいます。 データベースが開けていないのでしょうか。 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sakamotoryusei.wifidatabase/com.example.sakamotoryusei.wifidatabase.MainActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2093) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2118) at android.app.ActivityThread.access$700(ActivityThread.java:136) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1223) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4830) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) at com.example.sakamotoryusei.wifidatabase.MainActivity.onCreate(MainActivity.java:43) at android.app.Activity.performCreate(Activity.java:5015) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2057)             at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2118)             at android.app.ActivityThread.access$700(ActivityThread.java:136)             at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1223)             at android.os.Handler.dispatchMessage(Handler.java:99)             at android.os.Looper.loop(Looper.java:137)             at android.app.ActivityThread.main(ActivityThread.java:4830)             at java.lang.reflect.Method.invokeNative(Native Method)             at java.lang.reflect.Method.invoke(Method.java:511)             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559)             at dalvik.system.NativeStart.main(Native Method)
toukibi

2015/10/28 04:57 編集

すみません、どうやらデータベースのクエリ文が間違っていたようです、お手数おかけしてすみませんでした!
退会済みユーザー

退会済みユーザー

2015/10/28 05:58

いいえ.解決してよかったです.
guest

0

SQLiteDatabaseというactivityを作る必要はありません。MySQLiteOpenHelperとういうclassを作るだけで充分です。

また、使い方は下記の通りです。

Java

1MySQLiteOpenHelper hlpr = new MySQLiteOpenHelper(getApplicationContext()); 2mydb = hlpr.getWritableDatabase(); 3ContentValues values = new ContentValues(); 4values.put("ssid", "data1"); 5values.put("mhz", "data1"); 6mydb.insert("mytable", null, values); 7

使いどころはスキャンが終わった後あたりでしょう。

投稿2015/10/22 02:29

yona

総合スコア18155

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

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

0

SQLiteOpenHelperのクラスは別アクティビティにするのではなく,上のWifiManager04の内部クラスとして実装するべきではないでしょうか?そしてWifiManager04内でSQLiteOpenHelperのクラスのインスタンスを生成し,利用するといいのではないでしょうか.

投稿2015/10/22 00:02

swordone

総合スコア20651

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

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

toukibi

2015/10/22 01:43

回答ありがとうございます。 利用するというとどのようにすればよいでしょうか? 簡単にご教授お願いできませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問