そうだ。アンドロイドアプリを作ろう。その3
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

そうだ。アンドロイドアプリを作ろう。その3

2016-06-29 08:01
    作成? その2~CSV読み込み、sql保存まで
    今回はアプリと問題データを分けて管理してます。これは問題データの誤植や追加などでアプリを更新させたくないからです。
    最初の頃は手間がかかるますが、問題データの更新が楽になります。
    1.CSVファイルを準備する。


    Excelなどで作ってからCSVに変換する。
    別途テキストファイルなどで、文字化けを防ぐためにファイルを一度開いて文字コードをUTF-8に変更して保存する。
    130問入力したけど休みながら5時間もかかった。俺どんだけ無能なんだ
    2.さらにホームページを準備する。(仮のホームページ)
    http://www.geocities.jp/kuro4maru/


    ホームページを準備したのはアプリで読み込ませるCSVファイルを置くためです。
    ホームページにCSVファイルをおいてアプリに読ませようとするとエラーになりました。
    レンタルサーバーなら問題なかったのでしょうが今回は外部アクセスはなしです。
    3.クラス「DBHelper.java」を作成します。

    package kuro4maru.java_conf.gr.jp.draftingquestion1;

    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;


    // データベースを使うためにSQLiteOpenHelperを継承する。
    public class DBHelper extends SQLiteOpenHelper {
    public static final String TABLE_NAME ="quizu";
    public static final String QUIZU_ID = "_id";
    public static final String QUIZU_NAIYO = "naiyo";
    public static final String QUIZU_KAITOU = "kaitou";
    public static final String QUIZU_GAZOU = "gazou";

    public DBHelper(Context context, String name, int version) {
    super(context, name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    db.execSQL(
    "CREATE TABLE " + TABLE_NAME +
    "(" + QUIZU_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
    QUIZU_NAIYO + " TEXT," +
    QUIZU_KAITOU + " TEXT," +
    QUIZU_GAZOU + " TEXT" +
    ");");
    }

    // 新しい項目を追加したい時に使うメソッド @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
    onCreate(db);
    }

    public boolean deleteAll(SQLiteDatabase db){

    return db.delete(TABLE_NAME, null, null) > 0;
    }
    }

    DBHelperクラスにSQLiteOpenHelperを継承し2つのメソッドを作成します。deleteAllメソッドはおまけです。
    4.assetsフォルダを作成します。
    appを右クリックしてNew>Folder>Assets Folderを選択しそのままFINISHボタンをおしFolderを作成します。

    5.TopActivityを編集します。


    package kuro4maru.java_conf.gr.jp.draftingquestion1;

    import android.content.ContentValues;
    import android.content.Intent;
    import android.content.res.AssetManager;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;

    public class TopActivity extends AppCompatActivity {

    private static final String FILE_NAME = "quizu";
    private DBHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_top);

    // ボタンにインテントを設定する。
    Button btn1 = (Button) findViewById(R.id.start_button);
    btn1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent(TopActivity.this,
    MainActivity.class);
    startActivity(intent);
    }
    });

    // DBの初期化処理
    dbHelper = new DBHelper(this, FILE_NAME, 1);
    SQLiteDatabase db = dbHelper.getWritableDatabase();

    // 存在確認
    String query = "SELECT COUNT(*) FROM "+ DBHelper.TABLE_NAME +";";
    Cursor c = db.rawQuery(query, null);
    c.moveToFirst();
    Log.d("result",c.getString(0));
    int result = c.getInt(0);

    // 1件もない場合、DBのバージョンが上がった場合、ファイルの書き込みを行う。
    if(result <= 0){
    AssetManager assetManager = getResources().getAssets();
    try {
    // CSVファイルの読み込み
    InputStream is = assetManager.open("mondai.csv");
    InputStreamReader inputStreamReader = new InputStreamReader(is);
    BufferedReader bufferReader = new BufferedReader(inputStreamReader);
    String line = "";
    String array[] = null;
    while ((line = bufferReader.readLine()) != null) {
    array = line.split(",");
    ContentValues values = new ContentValues();
    // クイズ内容
    values.put(DBHelper.QUIZU_NAIYO, array[1]);
    // クイズ回答
    values.put(DBHelper.QUIZU_KAITOU, array[2]);
    if(array.length >= 4 ) {
    // クイズ画像(ない場合がある)
    values.put(DBHelper.QUIZU_GAZOU, array[3]);
    }
    db.insert(DBHelper.TABLE_NAME, null, values);
    }
    bufferReader.close();
    } catch (IOException e) {
    e.printStackTrace();
    } catch (SQLException e){
    e.printStackTrace();
    }
    }
    }
    }


    CSV取り込み部分はスレッド使ってないので時間があればスレッド処理をさせたいな。
    今回は以上です。
    今日中に完成させないと勉強に役にたたない。

    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。