package com.example.c84databasesample;
import java.util.Random;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
private static final String TAG = "Test";
private static final String[] NAMES = { "たろー", "じろー", "ぽん吉", "かなこ", "花子",
"ゆうた", "りょうた", "まえけん", "ほりけん", "きんたろう" };
private Random mRand = new Random(System.currentTimeMillis());
private ListView mListView;
private ListAdapter mAdapter;
private MyDatabaseHelper mHelper;
private SQLiteDatabase mDb;
private Cursor mCursor;
private boolean isStop;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listView1);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
loadList();
}
});
findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
createSampleData();
}
});
mHelper = new MyDatabaseHelper(this);
mDb = mHelper.getWritableDatabase();
// 5秒に一回データ生成を行うスレッドをスタート
startThread();
}
@Override
protected void onDestroy() {
super.onDestroy();
isStop = true;
if (mCursor != null) {
mCursor.close();
mCursor = null;
}
mDb.close();
mDb = null;
mHelper.close();
mHelper = null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
protected void loadList() {
Log.d(TAG, "loadList start");
if (mDb != null) {
if (mCursor != null) {
mCursor.close();
mCursor = null;
}
mCursor = mDb.query("USERS", null, null, null, null, null, null);
mAdapter = new MyCursorAdapter(this, mCursor);
mListView.setAdapter(mAdapter);
Log.d(TAG, "loadList end");
Log.d(TAG,
"isWriteAheadLoggingEnabled="
+ mDb.isWriteAheadLoggingEnabled());
}
}
private void startThread() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
MyDatabaseHelper helper = new MyDatabaseHelper(
MainActivity.this);
SQLiteDatabase db = helper.getWritableDatabase();
try {
// WALを有効にする
// db.enableWriteAheadLogging();
Log.d(TAG, "WAL :" + db.isWriteAheadLoggingEnabled());
db.beginTransaction();
int count = 0;
do {
// 生成処理
insertProc(db);
// 5回に一回更新処理をしてみる
count++;
if (count % 5 == 0) {
db.setTransactionSuccessful();
db.endTransaction();
db.beginTransaction();
}
} while (isStop);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
db.close();
helper.close();
}
}
});
t.start();
}
private void insertProc(SQLiteDatabase db) {
String name = NAMES[mRand.nextInt(NAMES.length)];
int age = mRand.nextInt(80);
ContentValues values = new ContentValues();
values.put("NAME", name);
values.put("AGE", age);
db.insert("USERS", null, values);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
Log.d(TAG, "inserted:" + name);
mHandler.post(new Runnable() {
@Override
public void run() {
loadList();
}
});
}
public void createSampleData() {
MyDatabaseHelper helper = new MyDatabaseHelper(this);
SQLiteDatabase db = helper.getWritableDatabase();
long start = 0;
try {
// WALを有効にする
db.enableWriteAheadLogging();
Log.d(TAG, "WAL :" + db.isWriteAheadLoggingEnabled());
db.beginTransaction();
start = System.nanoTime();
for (int i = 0; i < 10000; i++) {
String name = NAMES[mRand.nextInt(NAMES.length)];
int age = mRand.nextInt(80);
ContentValues values = new ContentValues();
values.put("NAME", name);
values.put("AGE", age);
db.insert("USERS", null, values);
}
start = printTimeLog("Insert処理", start, System.nanoTime());
db.setTransactionSuccessful();
start = printTimeLog("setTransactionSuccessful", start,
System.nanoTime());
} finally {
db.endTransaction();
start = printTimeLog("endTransaction", start, System.nanoTime());
db.close();
helper.close();
printTimeLog("Close処理", start, System.nanoTime());
}
}
private long printTimeLog(String text, long begin, long now) {
long dt = now - begin;
Log.d(TAG, "経過時間(" + text + "):" + dt / 1000);
return now;
}
}