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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

3回答

5108閲覧

SQLiteDataBaseが上手く使えません。

toukibi

総合スコア27

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2015/10/28 07:31

現在周囲のAPをスキャンしてデータベースに値を格納しようとしているのですがContentValuesへの値の設定の仕方がわかりません。このプログラムの場合にはどのように値を格納するように改変したらよいでしょうか? どうかよろしくお願いします。

lang

1public class MainActivity extends AppCompatActivity { 2 /** Called when the activity is first created. */ 3 private static MySQLiteHelper helper; 4 private SQLiteDatabase db; 5 private Context context; 6 private ListView listView; 7 private String ssid; 8 private int date ; 9 private int level; 10 private int freq; 11 12 @Override 13 public void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 helper = new MySQLiteHelper(this); 18 db = helper.getWritableDatabase(); 19 20 ContentValues values = new ContentValues(); 21 values.put(helper.COLUM_SSID,ssid); 22 values.put(helper.COLUM_FREQ,freq); 23 values.put(helper.COLUM_LEVEL,level); 24 values.put(helper.COLUM_DATE,date); //時刻を入れたい ButtonContent.time(); 25 db.insert(helper.TABLE_NAME,null,values); 26 27 28 listView = (ListView)findViewById(R.id.listView); //Listviewにリンク 29 30 final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1); 31 listView.setAdapter(adapter); //ListViewに渡す 32 final WifiManager manager = (WifiManager) getSystemService(WIFI_SERVICE); 33 34 /* メインスレッド以外から UI を触るための 仲介役 */ 35 final Handler handler = new Handler(); 36 37 /* 一定時間ごとに 実行してほしいことを run() の中に書く */ 38 final TimerTask timerTask = new TimerTask(){ 39 @Override 40 public void run() { 41 if (manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) { 42 // APをスキャン 43 manager.startScan(); 44 // スキャン結果を取得 45 List<ScanResult> apList = manager.getScanResults(); 46 final String[] aps = new String[apList.size()]; 47 for (int i = 0; i < apList.size(); i++) { 48 aps[i] ="SSID" + apList.get(i).SSID + "\n" + apList.get(i).frequency + "MHz" 49 + apList.get(i).level + "dBm" + ButtonContent.time(); 50 } 51 52 /* スキャンが終わったら表示する */ 53 /* TimerTask は メインスレッドで実行できないので、UIを触りたいのでHandlerを使う */ 54 handler.post(new Runnable() { 55 @Override 56 public void run() { 57 /* リストをきれいさっぱり空にして */ 58 adapter.clear(); 59 /* 新しい情報を全部足して */ 60 adapter.addAll(aps); 61 /* 中身変わったと教える */ 62 adapter.notifyDataSetChanged(); 63 } 64 }); 65 } 66 } 67 }; 68 /* TimerTaskは UI スレッドで実行できないので 別なスレッドの中で実行する */ 69 new Thread(new Runnable() { 70 @Override 71 public void run() { 72 new Timer(true).schedule(timerTask, 0, 500); 73 } 74 }).start(); 75 } 76 77 78 @Override 79 public void onDestroy(){ 80 super.onDestroy(); 81 db.close(); 82 } 83 84 85 @Override 86 public boolean onCreateOptionsMenu(Menu menu) { 87 // Inflate the menu; this adds items to the action bar if it is present. 88 getMenuInflater().inflate(R.menu.menu_main, menu); 89 return true; 90 } 91 92 @Override 93 public boolean onOptionsItemSelected(MenuItem item) { 94 // Handle action bar item clicks here. The action bar will 95 // automatically handle clicks on the Home/Up button, so long 96 // as you specify a parent activity in AndroidManifest.xml. 97 int id = item.getItemId(); 98 99 //noinspection SimplifiableIfStatement 100 if (id == R.id.action_settings) { 101 return true; 102 } 103 104 return super.onOptionsItemSelected(item); 105 } 106 107 108} 109

SQLiteOpenHelperクラスです。↓

lang

1public class MySQLiteHelper extends SQLiteOpenHelper implements BaseColumns { 2 3 private static final int DATABASE_VIRSION = 1; 4 private static final String DATABASE_NAME = "sqlite_wifi.db"; 5 6 //テーブル名やカラムはデータベースのアクセスに必要なのでpublic 7 public static final String TABLE_NAME = "mytable"; 8 public static final String COLUM_ID = "_id"; 9 public static final String COLUM_SSID = "ssid"; 10 public static final String COLUM_FREQ = "freq"; //カラムの割り振り、ID カラムIDには_idを使うことが必須事項 11 public static final String COLUM_LEVEL = "level"; 12 public static final String COLUM_DATE = "date" ; 13 14 private static final String MY_CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + COLUM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 15 COLUM_SSID + " TEXT NOT NULL," + COLUM_FREQ + " INTEGER NOT NULL," + COLUM_LEVEL + " INTEGER NOT NULL," + COLUM_DATE + "INTEGER NOT NULL );"; //クエリ分の作成処理 16 17 private static final String DROP_TABLE = "drop table " + TABLE_NAME; //tableの削除 18 19 public MySQLiteHelper(Context context) { 20 super(context, DATABASE_NAME, null, DATABASE_VIRSION); 21 } 22 23 @Override 24 public void onCreate(SQLiteDatabase db) { 25 26 db.execSQL(MY_CREATE_TABLE); //tableを作成するSQLを実行 27 } 28 29 @Override 30 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 31 db.execSQL(DROP_TABLE); 32 onCreate(db); //tableを削除して再生成 33 } 34} 35

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

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

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

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

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

guest

回答3

0

ベストアンサー

データベース構造を変更した際に,private static final int DATABASE_VIRSION = 1;の値を変更すること.
SQL文を正しく作ること.の2つで解決するはずです.
参考までに,write()メソッドを呼ぶことで,データを追加できるサンプル.
Activityなどから,必要に応じて write(context, scanResultList, date);を呼ぶことでデータベースを更新できます.

Java

1/* BaseColumns を使うなら これ自身に COLUM_ID を 定義する必要はありませんね */ 2/* 私的には使う必要性を感じません */ 3class MySQLiteHelper extends SQLiteOpenHelper /* implements BaseColumns */ { 4 5 /* VIRSION -> VERSION */ 6 /* Database の構成を変更したら この値を変更する */ 7 /* e.g.) column 名を書き変えた, column を増やした */ 8 /* 通常 インクリメント (+1) するだけでよい*/ 9 private static final int DATABASE_VIRSION = 2; 10 private static final String DATABASE_NAME = "sqlite_wifi.db"; 11 12 //テーブル名やカラムはデータベースのアクセスに必要なのでpublic 13 /* COLUM -> COLUMN */ 14 public static final String TABLE_NAME = "mytable"; 15 public static final String COLUM_ID = "_id"; 16 public static final String COLUM_SSID = "ssid"; 17 public static final String COLUM_FREQ = "freq"; //カラムの割り振り、ID カラムIDには_idを使うことが必須事項 18 public static final String COLUM_LEVEL = "level"; 19 public static final String COLUM_DATE = "date"; 20 21 private static final String MY_CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + 22 COLUM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 23 COLUM_SSID + " TEXT NOT NULL," + 24 COLUM_FREQ + " INTEGER NOT NULL," + 25 COLUM_LEVEL + " INTEGER NOT NULL," + 26 COLUM_DATE + " INTEGER NOT NULL );"; /* スペース抜けの修正 */ 27 28 private static final String DROP_TABLE = "drop table " + TABLE_NAME; //tableの削除 29 30 public MySQLiteHelper(Context context) { 31 super(context, DATABASE_NAME, null, DATABASE_VIRSION); 32 } 33 34 @Override 35 public void onCreate(SQLiteDatabase db) { 36 37 db.execSQL(MY_CREATE_TABLE); //tableを作成するSQLを実行 38 } 39 40 @Override 41 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 42 db.execSQL(DROP_TABLE); 43 onCreate(db); //tableを削除して再生成 44 } 45 46 47 /* 汎用メソッド追加 */ 48 /* date の型を知らないので long にしてあります */ 49 public static void write(Context context, List<ScanResult> resultList, long date) { 50 final SQLiteDatabase db = new MySQLiteHelper(context).getWritableDatabase(); 51 try { 52 for (ScanResult scanResult : resultList) { 53 ContentValues values = new ContentValues(); 54 values.put(COLUM_SSID, scanResult.SSID); 55 values.put(COLUM_FREQ, scanResult.frequency); 56 values.put(COLUM_LEVEL, scanResult.level); 57 values.put(COLUM_DATE, date); //時刻を入れたい ButtonContent.time(); 58 /* insert にすべきか update にすべきかは 考え所ですね */ 59 db.insert(TABLE_NAME, null, values); 60 } 61 } finally { 62 db.close(); 63 } 64 } 65 66 /* データベースからデータを取ってくる */ 67 public static List<MyResult> read(Context context) { 68 /* Database を読み取り専用で開く */ 69 final SQLiteDatabase db = new MySQLiteHelper(context).getReadableDatabase(); 70 71 try { 72 /* rawQuery() にてデータベースから指定アイテムを取ってくる */ 73 /* ? をわざわざ使わなくてもいいと考えるだろうが SQL インジェクション対策になる */ 74 /* ダメな例) db.rawQuery("SELECT * FROM " + TABLE_NAME, new String[0]) */ 75 /* もし TABLE_NAME に悪質なSQL文が入っていたら...? */ 76 final Cursor cursor = db.rawQuery("SELECT * FROM ?", new String[]{TABLE_NAME}); 77 try { 78 /* columnIndex は データベースを作った際に */ 79 /* 実行した CREATE TABLE 句の 順番で割り振られている */ 80 /* 手動で 0, 1, 2, 3 と振ることもできるが column 変更への耐性がなくなる */ 81 /* 良くない例) int ssidIndex = 1; int freqIndex = 2; ... */ 82 final int ssidIndex = cursor.getColumnIndex(COLUM_SSID); 83 final int freqIndex = cursor.getColumnIndex(COLUM_FREQ); 84 final int levelIndex = cursor.getColumnIndex(COLUM_LEVEL); 85 final int dateIndex = cursor.getColumnIndex(COLUM_DATE); 86 87 /* ArrayList のコンストラクタは 引数を取らなくてもよいが */ 88 /* サイズがわかっている場合には 指定した方が 高速である */ 89 /* ScanResult クラス は自分では扱えないため 自前で作ってみた */ 90 final List<MyResult> scanResults = new ArrayList<>(cursor.getCount()); 91 92 /* 最後まで cursor を動かす */ 93 /* Cursor は結構特殊な 振る舞いをします この書き方は覚えておきましょう */ 94 while (cursor.moveToNext()) { 95 final String ssid = cursor.getString(ssidIndex); 96 final int frequency = cursor.getInt(freqIndex); 97 final int level = cursor.getInt(levelIndex); 98 final long date = cursor.getInt(dateIndex); 99 scanResults.add(new MyResult(ssid, frequency, level, date)); 100 } 101 return scanResults; 102 } finally { 103 /* 忘れずに close させるために try-finally を使用 */ 104 cursor.close(); 105 } 106 } finally { 107 db.close(); 108 109 } 110 } 111} 112 113class MyResult { 114 public final String ssid; 115 public final int frequency; 116 public final int level; 117 public final long date; 118 119 public MyResult(String ssid, int frequency, int level, long date) { 120 this.ssid = ssid; 121 this.frequency = frequency; 122 this.level = level; 123 this.date = date; 124 } 125}

投稿2015/10/28 12:37

編集2015/11/02 08:57
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

toukibi

2015/10/28 18:03

回答ありがとうございます。 先ほどのコードはおっしゃるとおりVERSIONの値を変えたら動くようになりました。以後よく覚えておきます。 えっと、こちらのコードは public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); helper = new MySQLiteHelper(this); db = helper.getWritableDatabase(); このときの`db = helper.getWritableDatabase();`をwrite()メソッドに置き換えるという考えで正しいでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/28 18:05

このコードを利用する際は,ActivityからHelperのインスタンス生成を行う必要はありません.特に前準備いらずで,ただMySQLiteHelper.write()を呼び出せば,データベースに追記されます.
退会済みユーザー

退会済みユーザー

2015/10/28 18:14 編集

こんな感じです.open,close処理をActivity側から行う必要もなくなります.質問のContentValueへの値の指定は,write()メソッド内を参照してください. public class MainActivity extends AppCompatActivity { /** Called when the activity is first created. */ private static MySQLiteHelper helper; private SQLiteDatabase db; private Context context; private ListView listView; private String ssid; private int date ; private int level; private int freq; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); //Listviewにリンク final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1); listView.setAdapter(adapter); //ListViewに渡す final WifiManager manager = (WifiManager) getSystemService(WIFI_SERVICE); /* メインスレッド以外から UI を触るための 仲介役 */ final Handler handler = new Handler(); /* 一定時間ごとに 実行してほしいことを run() の中に書く */ final TimerTask timerTask = new TimerTask(){ @Override public void run() { if (manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) { // APをスキャン manager.startScan(); // スキャン結果を取得 List<ScanResult> apList = manager.getScanResults(); /*************** 例えばこの辺で データベースに書き込んでみる ***************/ MySQLiteHelper.write(MainActivity.this, apList, ButtonContent.time()); 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" + ButtonContent.time(); } /* スキャンが終わったら表示する */ /* TimerTask は メインスレッドで実行できないので、UIを触りたいのでHandlerを使う */ handler.post(new Runnable() { @Override public void run() { /* リストをきれいさっぱり空にして */ adapter.clear(); /* 新しい情報を全部足して */ adapter.addAll(aps); /* 中身変わったと教える */ adapter.notifyDataSetChanged(); } }); } } }; /* TimerTaskは UI スレッドで実行できないので 別なスレッドの中で実行する */ new Thread(new Runnable() { @Override public void run() { new Timer(true).schedule(timerTask, 0, 500); } }).start(); } }
toukibi

2015/10/28 18:36

問題なく動作しているようです! 格納された値を確認するにはadb shellを使えば良いのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/28 18:41

よかったです.(最初の質問からだいぶ離れた回答になってしまいましたが) 格納された値の確認方法はいくつかありますが,上のソースコードならば,Activity内で,MySQLiteHelper.read()メソッドを呼べば,値一覧をListで取り出します. Toastを使えば,実機やエミュレータ上で見れるメッセージを出すことができます.LogやSystem.outを用いれば,デバッグ用のLogCat上で見ることができます.
toukibi

2015/10/28 18:59

いえいえ、本当に色々教えてくださり心から感謝しています。 私の知識が全く足りず、質問攻めになってしまい大変申し訳ないです。 また別の話になってしまうのですが、このデータベースはアプリを終了したらそれまでの値は消えてしまうのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/28 19:04

どういたしまして.知識はこれから増えていくものです! データベースはアプリを終了しても消えません.データを一度入力したら,次回以降もそのデータは利用できます.アプリ内でそのデータを消す,アプリ外でデータベースを消す,アプリをアンインストールする,携帯を初期化するなどであれば,データは消えてしまいます.
toukibi

2015/10/28 19:24

消えないんですね、よかったです。 MySQLiteHelper.read()メソッドで取り出した値を画面上で一覧として表示させるにはListViewを利用すれば良いのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/28 19:33

データベース,Preference,ローカルストレージは消えません.データの永続化については,参考になるサイトがたくさんあるので,調べてみるとよいと思います. 何を利用してもよいでしょうが,ListViewは一案として良いでしょう.その他,TextViewに入れてしまうこともできるでしょう.例えば,↓のような感じです. /* StringBuilder.append() は 文字列同士の+演算より高速なのでこちらを利用 */ StringBuilder stringBuilder = new StringBuilder(); /* 改行コードを手に入れておく */ String BR = System.getProperty("line.separator"); for (MyResult result :MySQLiteHelper.read(context)) { stringBuilder.append("SSID: "); stringBuilder.append(result.ssid); stringBuilder.append(" DATE: "); stringBuilder.append(result.date); stringBuilder.append(BR); } /* textView にセット */ textView.setText(stringBuilder);
toukibi

2015/10/28 19:55

ありがとうございます。調べてみます。 そういう方法もあるんですね、そこも勉強します! あともう一つ質問なのですが、このプログラムの取得データをexcelファイル、csvファイルにすることは可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/28 20:27 編集

csvとして出力することは簡単です. Activityに↓のようなコードを追記して,呼び出すだけ.csvはカンマ(,)と改行のみで構成されるので簡単に作ることができます. private void csvOutput(String filename, List<MyResult> resultList) { final String br = System.getProperty("line.separator"); OutputStream out = null; try { out = openFileOutput(filename, MODE_PRIVATE); try { PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, "UTF-8")); writer.append("ssid,frequency,level,date"); for (MyResult result : resultList) { writer.append(result.ssid); writer.append(','); writer.append(result.frequency); writer.append(','); writer.append(result.level); writer.append(','); writer.append(result.date); writer.append(br); } } finally { writer.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } finally { if (out != null) try { out.close(); } catch (IOException e) { e.printStackTrace(); } } }
toukibi

2015/10/28 20:22

ごめんなさい、よび出すというのはactivity内で呼び出すということですか? これによって値が格納されたファイルがcsvになるということでしょうか? すみません、流れが分からなくて,,,
退会済みユーザー

退会済みユーザー

2015/10/28 20:26

そうです.基本的には,Activityからしかローカルストレージにアクセスできないので,ActivityにcsvOutputを追記して,Activity内から呼び出します. このcsvOutputを呼ぶと,List<MyResult>をcsvの形式で,filenameというファイル名で保存します.
toukibi

2015/10/28 20:39

呼び出すのはonCreate内ですか? filenameが作成される場所は/data/data/{app dir}/filesになるんでしょうか。
退会済みユーザー

退会済みユーザー

2015/10/28 20:45

どこで呼び出してもかまいません.必要なタイミングで呼び出しましょう. そうです.基本的にはそのアプリ用の領域にのみ読み書きの権限が与えられるので,そこに作成します.filenameには"test.csv"などのみでパスは含めなくてよかったはずです. Androidは主に,イベントによって動作します.クリックイベントや時間イベントなどに,リスナーをくっつけて,そのタイミングでこれをさせようとかっていうのを書いていきます.あなたが必要だと思うイベントを拾ったときに,呼び出しましょう.(Buttonクリック時など)
toukibi

2015/10/28 21:17

なるほどー、書きたいことがあってもどこに書けばよいのか分からないことが多いですが、そういう考え方なんですね。 先述のtextviewに表示するコードなんですけど public void run() { if (manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED) { // APをスキャン manager.startScan(); // スキャン結果を取得 List<ScanResult> apList = manager.getScanResults(); MySQLiteHelper.write(MainActivity.this, apList, ButtonContent.time()); /* StringBuilder.append() は 文字列同士の+演算より高速なのでこちらを利用 */ StringBuilder stringBuilder = new StringBuilder(); /* 改行コードを手に入れておく */ String BR = System.getProperty("line.separator"); for (MyResult result :MySQLiteHelper.read(context)) { textView = (TextView) findViewById(R.id.database_text); stringBuilder.append("SSID: "); stringBuilder.append(result.ssid); stringBuilder.append(" DATE: "); stringBuilder.append(result.date); stringBuilder.append(BR); } run()メソッドで繰り返し行うと考えてここに記述したのですがエラーになってしまいました。データベースに同時に複数アクセスしたのが問題でしょうか? 10-29 06:13:25.681 31329-31345/com.example.sakamotoryusei.wifidatabase E/AndroidRuntime﹕ FATAL EXCEPTION: Timer-0 java.lang.NullPointerException at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) at com.example.sakamotoryusei.wifidatabase.MySQLiteHelper.read(MySQLiteHelper.java:81) at com.example.sakamotoryusei.wifidatabase.MainActivity$1.run(MainActivity.java:61) at java.util.Timer$TimerImpl.run(Timer.java:284)
退会済みユーザー

退会済みユーザー

2015/10/28 21:28

はい.Androidに限らず,UIをもつ物は,そういった思想を持っているのだと思われます. getDatabaseLockedは,DatabaseHelperに渡したContextがnullのとき吐かれるようです. あなたのソースコードでは,MainActivityで private Context context;という記述がありますね.このcontextは何も代入していない以上,nullを示しています.nullを渡しても仕方ありません.MainActivityの実体(MainActivity.this)を渡してあげれば解決します.
toukibi

2015/10/29 06:21

for (MyResult result :MySQLiteHelper.read(MainActivity.this)) { ↑こういうことですよね?今度はまた違うエラーが出てしまったのですがこれは何がいけないのでしょうか? 10-29 15:09:35.820 6045-6078/com.example.sakamotoryusei.wifidatabase E/SQ LiteLog﹕ (1) near "?": syntax error 10-29 15:09:35.820 6045-6078/com.example.sakamotoryusei.wifidatabase W/dalvikvm﹕ threadid=12: thread exiting with uncaught exception (group=0x41cea438) 10-29 15:09:35.820 6045-6078/com.example.sakamotoryusei.wifidatabase E/AndroidRuntime﹕ FATAL EXCEPTION: Timer-0 android.database.sqlite.SQLiteException: near "?": syntax error (code 1): , while compiling: SELECT * FROM ?
退会済みユーザー

退会済みユーザー

2015/10/29 07:17

自分の書いていたコードが間違ってました.これは動きませんね. final Cursor cursor = db.rawQuery("SELECT * FROM ?", new String[]{TABLE_NAME}); ↓こちらが正しいです. final Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null); これでそのエラーは解決します.
toukibi

2015/10/29 08:45

ありがとうございます。 ひとまず自分でいろいろ試してみようと思います。 また何かあったら質問させていただいてもよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2015/10/29 08:47 編集

なんでも試してみてですね.いくらでもどうぞ! ここでも,新規の質問でもきっと誰かが答えてくれますよ.
toukibi

2015/11/05 15:21

こんばんは。 質問なのですが、android端末で取得したデータをPCのファイルに常に転送できるようにするということは可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2015/11/05 19:01 編集

例えば,Androidのカメラで定期的に写真を撮り,転送するなどでしょうか? もちろん可能です.低レベルの実装ならば,ソケット通信を利用することができます. PC: ポートを解放しておく-> Android: カメラを使って撮影(その他のデータ取得)-> Android: データをシリアライズ(転送しやすいようにbyte列に直す)-> Android: PCのIPアドレス:ポートに対してデータを送信-> PC: データを受信-> PC: データをデシリアライズ(byte列から元の形に戻す)-> PC: データを見る など.
toukibi

2015/11/05 19:40

回答ありがとうございます。 考えてることといたしましては、このwifiのAPについてのデータをUDP/TCP通信などをつかってデータベースではなくprintlnなどを利用して簡単にテキストデータを出力できるようにできないかなと考えていまして。 まとめるとPC上でファイルとして閲覧できるようにデータを取れるようしたいと考えています。
退会済みユーザー

退会済みユーザー

2015/11/05 19:47

Androidで,アクセスポイント探索,PCに送信. PCで,アクセスポイント情報受信,ファイルに保存ってことですね. 可能です.Androidの障壁を除けば,できないことはありません!
toukibi

2015/11/05 20:34

ありがとうございます! 調べてみます!
退会済みユーザー

退会済みユーザー

2015/11/06 08:32

どういたしまして
guest

0

コメントと間違えたため削除します。

投稿2015/10/28 12:27

編集2015/10/28 12:28
yona

総合スコア18155

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

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

0

何が出来ないのかよくわかりませんが
for (int i = 0; i < apList.size(); i++) {}の中で
ContentValues values = new ContentValues();
values.put(helper.COLUM_SSID,ssid);
values.put(helper.COLUM_FREQ,freq);
values.put(helper.COLUM_LEVEL,level);
values.put(helper.COLUM_DATE,date); //時刻を入れたい ButtonContent.time();
db.insert(helper.TABLE_NAME,null,values);
上記の処理を行えばいいでしょう。

投稿2015/10/28 07:59

yona

総合スコア18155

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

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

toukibi

2015/10/28 08:50

回答ありがとうございます。 実行したところ下記のようなエラー文がでたのですがこれはカラムがなかったり、クエリ文がおかしいという解釈でよいのでしょうか? 10-28 17:45:08.329 10122-10147/? E/SQLiteLog﹕ (1) table mytable has no column named frequency 10-28 17:45:08.339 10122-10147/? E/SQLiteDatabase﹕ Error inserting level=0 frequency=0 SSID=null android.database.sqlite.SQLiteException: table mytable has no column named frequency (code 1): , while compiling: INSERT INTO mytable(level,frequency,SSID) VALUES (?,?,?) at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467) at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) at com.example.sakamotoryusei.wifidatabase.MainActivity$1.run(MainActivity.java:68) at java.util.Timer$TimerImpl.run(Timer.java:284)
yona

2015/10/28 08:56 編集

コードとエラーが噛み合っていません。 テーブルのカラム名や数を途中で変えたりしていませんか? 内部のテーブルでは3カラムしかないのに5カラム分のデータを入れようとしているためエラーになっています。 一度アプリのデータを削除するか、アプリをアンインストールしてから再度実行してください。
toukibi

2015/10/28 10:45

実行したところこのようになりました。 3行目のエラーでVALUESが(?)なのは値が取れていないということなのでしょうか。 10-28 19:18:25.462 20068-20106/? E/SQLiteLog﹕ (1) table mytable has no column named date 10-28 19:18:25.462 20068-20106/? E/SQLiteDatabase﹕ Error inserting level=-90 frequency=2472 date=10/28 19:18:06 SSID=UUNET-LAB11 android.database.sqlite.SQLiteException: table mytable has no column named date (code 1): , while compiling: INSERT INTO mytable(level,frequency,date,SSID) VALUES (?,?,?,?) コードはいま下記のように書いているのですが、INTEGER PRIMARY KEY のカラムもContentValuesに記述しなければいけないのでしょうか? ```lang-java 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" + ButtonContent.time(); ContentValues values = new ContentValues(); values.put(helper.COLUM_SSID,apList.get(i).SSID); values.put(helper.COLUM_FREQ,apList.get(i).frequency); values.put(helper.COLUM_LEVEL,apList.get(i).level); values.put(helper.COLUM_DATE,date); //時刻を入れたい ButtonContent.time(); db.insert(helper.TABLE_NAME,null,values); } ```
yona

2015/10/28 10:52

違います、?なのはプリペアドステートメントと言う機能を使っているからです。 調べてみてください。 また、エラーではdateなんてカラム名なんか無いよと言っているので、オートインクリメントのカラムは関係無いと思います。
toukibi

2015/10/28 12:18

public static final String TABLE_NAME = "mytable"; public static final String COLUM_ID = "_id"; public static final String COLUM_SSID = "SSID"; public static final String COLUM_FREQ = "frequency"; //カラムの割り振り、ID カラムIDには_idを使うことが必須事項 public static final String COLUM_LEVEL = "level"; public static final String COLUM_DATE = "date" ; private static final String MY_CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + COLUM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUM_SSID + " TEXT NOT NULL," + COLUM_FREQ + " INTEGER NOT NULL," + COLUM_LEVEL + " INTEGER NOT NULL," + COLUM_DATE + "TEXT NOT NULL );"; //クエリ分の作成処理 データベースの構文なのですが、つまりはここのdateがおかしいということでしょうか。
yona

2015/10/28 12:27

一度整理しましょう。 ・質問者は「_id,level,frequency,date,SSID」をカラムに持つテーブルを作った。 ・「level,frequency,date,SSID」のそれぞれにデータを入れようとしている。ContentValueを使っているので多分正しい。 ・でも、dateが存在しないと言われる。 上から考えられるのはテーブルが正しく作られていないということです。とくにクリエイト文のdateカラムを作っている箇所が怪しいです。 COLUM_DATE + "TEXT NOT NULL );"; COLUM_DATEとTEXT NOT NULL の間に空白が無いのが気になります。
退会済みユーザー

退会済みユーザー

2015/10/28 12:28

いくつかtoukibiさんの質問を拝見しておりますが,private static final int DATABASE_VIRSION = 1;の値を変更していないように見えます.Version値はデータベースの構成を変更したとき(カラム名を変更したり,追加したり),変えなければなりません.これを変えることで,HelperクラスはonUpgrade()を呼び,データベースを作り直します.これで解決するはずです.
yona

2015/10/28 12:36 編集

私は開発前の状態でバージョンを上げるのはあまり良いとは思えないですがいかがでしょうか? でも、データベースを変更した場合は「バージョンを上げる」か、「データを削除する」かどちらかをしないといけないですよ。
退会済みユーザー

退会済みユーザー

2015/10/28 12:43

私は,デバッグ中にもまめにデータベースの削除・作成を行い,動作確認を行いたいため,しばしばバージョンを上げます.もちろんチェックの度に,"DROP TABLE"を行ってもよいのでしょうが,比較すると書き換えが多いです.(コメントアウトするにしても)int型なので,メジャーリリースの際に,10000単位で数値を上げるとかの工夫をすれば十分だと思っています.(e.g. int VERSION = MAJOR * 10000 + MINOR)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問