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

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

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

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

Android Studio

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

Q&A

解決済

1回答

548閲覧

android studio でsqlを使いデータを登録したいのですが登録したデータを表示したときにエラーが起きてしまいます。どこが間違っているのでしょうか?

yamaiti3

総合スコア28

Android

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

Android Studio

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

0グッド

1クリップ

投稿2017/12/27 13:22

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

private final static String DB_NAME="testDB.db"; private final static String DB_TABLE="teatTable"; private final static int DB_VERSION=1; private SQLiteDatabase databaseObject; private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText=(EditText)findViewById(R.id.editText); DatabaseHelper dbHelperObject = new DatabaseHelper(MainActivity.this); databaseObject = dbHelperObject.getWritableDatabase(); //保存ボタン findViewById(R.id.button) .setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { try{ //データベースへの書き込み String writeString = editText.getText().toString(); writeToDB(writeString); }catch(Exception e){ //書き込み失敗時にメッセージ showDialog( getApplicationContext(), "ERROR", "データベースの書き込みに失敗しました" ); } } }); findViewById(R.id.button2) .setOnClickListener( new View.OnClickListener(){ @Override public void onClick(View view){ try{ //データベースの読み込み String readString =readToDB(); editText.setText(readString); }catch(Exception e){ showDialog( getApplicationContext(), "ERROR", "データの読み込みに失敗しました"); } } }); } /*************************************** * */ private void writeToDB(String editedString)throws Exception{ ContentValues contentValObject =new ContentValues(); contentValObject.put("id","0"); contentValObject.put("info",editedString); int numberOfColumns = databaseObject.update( DB_TABLE, contentValObject, null, null ); } /**************************************** * */ private String readToDB()throws Exception{ //データベースからテーブルを読み込む Cursor cursor=databaseObject.query( DB_TABLE, new String[]{"id","info"}, "id='0'", null, null, null, null ); //cursor内のレコード数が0の場合は例外処理を行うインスタンスを生成 if (cursor.getCount() == 0){ throw new Exception(); } //カーソルの位置を先頭のレコードに移動 cursor.moveToFirst(); String valueCursor = cursor.getString(1); cursor.close(); return valueCursor; } /************************************** * */ private static void showDialog( Context context, String title, String text ){ AlertDialog.Builder varAlertDialog= new AlertDialog.Builder(context); varAlertDialog.setTitle(title); varAlertDialog.setMessage(text); varAlertDialog.setPositiveButton("OK",null); varAlertDialog.show(); } //ヘルパークラスの定義 private static class DatabaseHelper extends SQLiteOpenHelper{ //データベースを作成、 public DatabaseHelper(Context context){ //ヘルパークラスのコンストラクタの呼び出し super( context, DB_NAME, null, DB_VERSION ); } //テーブルを作成するメソッドの定義 @Override public void onCreate(SQLiteDatabase db){ db.execSQL( "CREATE TABLE IF NOT EXISTS "+ DB_TABLE+ "(id text primary key,info text)" ); } //データベースをアップグレードするメソッドの定義 @Override public void onUpgrade( SQLiteDatabase db, int oldVersion, int newVersion ){ db.execSQL("DROP TABLE IF EXISTS "+DB_TABLE); onCreate(db); } }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずこのプログラムは、新規作成したデータベースに何のデータも存在しないのに、書き込みにupdate()を使っていることが問題なんじゃないでしょうか。これだと、「アップデートすべき行が存在しない」ので、何も行われないでしょう。

「存在しない行を新たに追加する」のならinsert()を使うことになりますし、データベースの新規作成時にデフォルトの行を用意するのであれば

Java

1 //テーブルを作成するメソッドの定義 2 @Override 3 public void onCreate(SQLiteDatabase db) { 4 db.execSQL( 5 "CREATE TABLE IF NOT EXISTS " 6 + DB_TABLE + "(id text primary key,info text)" 7 ); 8 // デフォルトの行を追加する 9 db.execSQL("INSERT INTO " 10 + DB_TABLE + "(id, info) values('0', 'default');"); 11 }

とでもして1つ行を作っておいて、この行をupdate()で更新することになるでしょう。どちらを企図していたのかは私にはわかりませんので、「こうすべき」とは言えません。

それから、AlertDialog.BuilderのコンストラクターにApplicationContextを与えると、エラーでアプリが落ちます(質問で生じてる問題はむしろこちらなのかな)。ですから、showDialog()の第1引数は

Java

1 showDialog( 2 MainActivity.this, 3 "ERROR", 4 "データの読み込みに失敗しました"); 5 }

のようにして、MainActivityの持つActivityContextを与えるように修正しましょう。

投稿2017/12/28 11:59

keicha_hrs

総合スコア6768

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

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

yamaiti3

2017/12/28 13:49

ご親切に回答していただきありがとうございます。アプリ開発初心者でよくわからないところが多々ありまして回答の部分を訂正したのですがERRORのメッセージがでてしまいました。本当にアプリ開発の初心者で頼りきりになってしまいますがご回答お持ちいたしております。
keicha_hrs

2017/12/29 01:47

回答した「デフォルトの行を追加する」を試したのであれば、これはデータベースファイルを新規作成したときに実行される処理になりますので、今までの作業によってファイルが存在していたら走りません。端末側でアプリのアンインストールを行えばデータベースファイルも削除されますので、その後に試してみてはいかがでしょうか。
yamaiti3

2018/01/15 14:25

返信が遅くなり大変申し訳ございませんでした。無事データベースへの書き込みができました。協力していただき大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問