アプリケーションをアンインストールするとファイルとして作成したデータベースも自 動的に削除されます。
「例題27-1」AKBに関するデータベースを作成し、ボタンのクリックでデータを読み出し
ます。実行するたびに、同じレコードが追加されないように「if (!c.moveToFirst())」で判 定しています。データがない新規の状態で「c.moveToFirst()」はfalseを返します。すでに データがある状態で追加しようとする場合「c.moveToFirst()」はテーブルの先頭ではなく データの追加先頭位置への移動になります。
・main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="データベースの表示"
/>
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
・DatabaseHelper.java package jp.sqlite1;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.content.Context;
public class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) {
super(context,"akb.db", null,1);
}
@Override
public void onCreate(SQLiteDatabase db) { db.execSQL(
"create table if not exists akb_table (" + " id integer primary key autoincrement," + " topic text,"+
" memo text )");
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { db.execSQL("drop table if exists akb_table");
onCreate(db);
} }
・SQLite.java package jp.sqlite1;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;
public class SQLite1 extends Activity { private SQLiteDatabase db;
private DatabaseHelper helper;
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.text);
Button bt1=(Button)findViewById(R.id.button1);
bt1.setOnClickListener(new Disp());
String key[]={"AKB48","SKE48","NMB48"};
String value[]={
"秋葉原を拠点とする女性アイドルグループ", "名古屋・栄を拠点とするAKB48の姉妹ユニット", "大阪・難波を拠点とするAKB48の姉妹ユニット"};
helper=new DatabaseHelper(this);
db=helper.getWritableDatabase();
Cursor c=db.query("akb_table",new String[]
{"id","topic","memo"},null,null,null,null,null);
if (!c.moveToFirst()){
for (int i=0;i<key.length;i++){
ContentValues cv=new ContentValues();
cv.put("topic",key[i]);
cv.put("memo",value[i]);
db.insert("akb_table",null,cv);
} }
db.close();
}
class Disp implements OnClickListener { public void onClick(View v) {
db=helper.getReadableDatabase();
Cursor c=db.query("akb_table",new String[]
{"id","topic","memo"},null,null,null,null,null);
String s="";
while (c.moveToNext()){
s+=c.getInt(0)+":"+c.getString(1)+":"+c.getString(2)+"¥n";
}
tv.setText(s);
c.close();
db.close();
} } }
「補足」すでにテーブルがある場合は全データを削除して新たにデータを追加するには以 下のようにします。ただしidの値は1にクリアされずに増加していきます。
if (c.moveToFirst())
db.delete("akb_table", null, null);
for (int i=0;i<key.length;i++){
ContentValues cv=new ContentValues();
cv.put("topic",key[i]);
cv.put("memo",value[i]);
db.insert("akb_table",null,cv);
}
28 章 Gmail( 実機のみ )
Androidでは次の3つのメールが使用できます。
(1)Gmail
(2)キャリアメール(SMS/MMS) (3)E-mail(PCメール)
キャリアメールはdocomoの場合は「spモードメール」、SoftBankの場合は「S!メール」、
auの場合は「Cメール」となります。Gmailは、Google社によるフリーメールサービスで、
Androidでは各機種で共通です。
インテントを使ったメール送信の方法は「中級 Android的プログラミング法」の「10 章 インテントとアクティビティ」で説明しました。この章ではGmailを受信した時の各 種処理方法を説明します。
28-1 Gmail の受信状況
Gmailの受信状況を調べるには、queryメソッドの第1引数のコンテンツプロバイダURI
に「"content://gmail-ls/conversations/XXXXXXX@gmail.com"」を指定し、第3引数にメ ールボックスの種別を指定します。コンテンツプロバイダについては「中級 Android的プ ログラミング法」の「14章 コンテンツプロバイダ」を参照してください。
Cursor c=getContentResolver().query(
Uri.parse("content://gmail-ls/conversations/XXXXXXX@gmail.com"), null,
"label:^i", null, null);
メールボックスの種別として以下があります。
メールボックスの種別 意味
"^f" SENT
"^i" INBOX
"^r DRAFT
"^u" UNREAD
"^k" TRASH
"^s" SPAM
"^t" STARRED
"^b" CHAT(BUZZ)
"^vm" VOICEMAIL
"^g" IGNORED
"^all" ALL
"^^vmi" VOICEMAIL_INBOX
"^^cached" CACHED
"^^out" OUTBOX
Gmailの受信ボックスのカーソルデータcからデータ(たとえば件名)を取得するには 以下のようにします。
String subject=c.getString(c.getColumnIndex("subject"));
getColumnIndexの引数に指定できる主なキーとして以下があります。この他にlabelIds、
numMessages、maxMessageId、hasAttachments、hasMessagesWithErrors、
forceAllUnreadlなどがあります。このカーソルでは受信メッセージの本文は取得できませ
ん。「28-2 受信メッセージの本文の取得」を参照してください。
キー 意味
_id メッセージID。
subject 件名。
snippet 本文の要約。
date 受信日時。
fromAddress 送信者アドレス。
personalLevel アドレス帳のグループ。
「例題28-1」画面のタッチでGmail受信メッセージの一覧(件名、受信日時、要約)をト
ーストで表示します。
・マニフェスト(AndroidManifest.xml)
<uses-permission android:name="com.google.android.gm.permission.READ_GMAIL"/>
・GMail1.java package jp.gmail1;
import java.util.Date;
import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.*;
import android.widget.Toast;
public class GMail1 extends Activity {
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN){
try {
Cursor
c=getContentResolver().query(Uri.parse("content://gmail-ls/conversations/akasai123@g mail.com"),null,"label:^i",null,null);
startManagingCursor(c);
String msg="";
while (c.moveToNext()){
String subject=c.getString(c.getColumnIndex("subject"));
String date=c.getString(c.getColumnIndex("date"));
Date d=new Date(Long.valueOf(date));
String snippet=c.getString(c.getColumnIndex("snippet"));
msg+="件名:"+subject+"¥n受信日:"+d.toLocaleString()+"¥n要 約:"+snippet+"¥n¥n";
}
Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
}
catch (Exception e){ } }
return super.onTouchEvent(event);
} }
「補足」Dateオブジェクトdを文字列に変換する方法として以下の3種類があります。
d.toString()は「2011-07-20」
d.toLocaleString()は「2011/07/20 14:45:37」
d.toGMTString()は「20 Jul 2011 05-45-37 GMT」。これは日本時間から「-9」した標準時 間。
29 章 GoogleMap
GoogleMapをAndroidで使用するには「Android Maps API Key」を取得する必要があ
ります。またプロジェクトの作成に当たっては通常のプロジェクトとは以下の点が異なり ます。
・Google APIsライブラリのインストール(一度設定すればよい)
・map用AVDの生成(一度設定すればよい、実機では必要ない)
・ビルド・ターゲットに「Google APIs」を指定(その都度指定)
GoogleMapを利用してできることは以下のようなものです。この章ではこれらの使用方
法を説明します。
・地図(通常の地図、衛星写真、交通情報)の表示
・マップコントローラによる位置やズームの制御
・ロケーションAPIによる現在位置の取得
・オーバーレイ機能