検索
AND検索
OR検索
トップ
|
リロード
|
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
勉強会/XMLSQLite をテンプレートにして作成
詳細は
入会方法
をご覧下さい。
メニュー
日本Androidの会とは?
入会方法
イベント
技術資料
ワーキンググループ
支部
リリース
Japan Android Report
リンク
FAQ
権利関係
プライバシーポリシー
Twitter
公式Youtubeチャンネル
NPOサイト
最新の10件
2023-11-13
ABC2023A-pr
リリース
2023-10-13
MenuBar
入会方法
2023-09-17
ワーキンググループ/香川支部
2023-09-07
林田官呂
2023-08-19
イベント/イベント予定表
2023-06-11
日本Androidの会とは?
2023-06-01
秋葉 楓
2022-11-07
スタッフ
edit
Total:0/Today:0
開始行:
[[勉強会]]
* XMLとSQLiteを使用する [#mdc78c0d]
- ※現在レビュー中です。内容は間違いを含んでいる可能性があ...
WebAPIなどから取得したXMLを解析(パース)して、内容を取り出...
DOMはXMLをツリー上に展開し、自由に読み書きできるものの、...
一方、SQLiteについては強力で使いやすく、Web上にもコードを...
ここでは、前のチュートリアルに引き続き、org.w3c.domパッケ...
- 確認中:XMLパーサはorg.w3c.domを使っているという表現で良...
** 手順1:公開されているandroid用のユーティリティのソース...
- [[Androidでorg.apache.http.clientを使用する>勉強会/Http...
- RestfulClientクラスにBASIC認証機能を付けたので、先のチ...
** 手順2:プロジェクトを作成しましょう [#h9cf8a87]
Twitterクライアント用のプロジェクトを作成します。
- "File -> New -> Project"を選択して、開いたダイアログで"...
- 開いたダイアログで、以下のように入力してFinishボタンを...
-- Project Name: HelloXML
-- Package name: net.it4myself.helloxml
-- Activity Name: .HelloXMLActivity
-- Application Name: ハローXML
** 手順3:マニフェストファイルを設定する [#j007d933]
- このプロジェクトではインターネットにアクセスするため、...
- もうソース無くても大丈夫でしょう?
** 手順4:レイアウトを決定する [#x055f760]
- このプロジェクトは2つのレイアウトファイルを使います。
- 画面のレイアウトを決定するために、res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/an...
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="User:"
>
</TextView>
<EditText
android:id="@+id/username_edit_id"
android:layout_width="200px"
android:layout_height="wrap_content"
android:textSize="18sp"
>
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Password:"
>
</TextView>
<EditText
android:id="@+id/password_edit_id"
android:layout_width="200px"
android:layout_height="wrap_content"
android:textSize="18sp"
>
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/publicTimeline_button_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PublicTimeline"
>
</Button>
<Button
android:id="@+id/myTimeline_button_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="My Timeline"
>
</Button>
</LinearLayout>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
</ListView>
</LinearLayout>
- リストの各行のレイアウトのために、res/layout/list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/an...
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
- main.xmlのListViewのidを"@+id/android:list" とするのは...
** 手順5:手順1で作ったプロジェクトをビルドパスに加える [...
- [[Androidでorg.apache.http.clientを使用する>勉強会/Http...
** 手順6:パブリックタイムラインとフレンドタイムラインを...
- ※筆者はTwitterにあまり詳しくないので、用語など間違えて...
- Twitter APIは英文らしいので、[[Twitter API 仕様書 日本...
- Twitterユーザ全体のタイムラインである、パブリックタイム...
- 自分がフォローしている友達だけのタイムラインである、フ...
- 先にブラウザを使ってどんなXMLが返ってくるのか確認してお...
- BASIC認証用にRestfulClientクラスを改良しておいたので、...
** 手順7:パブリックタイムラインとフレンドタイムラインを...
Settingsクラスについては
- mSettings = new Settings(this, null);で生成
- String user = mSettings.get("user");でuserに関連づけて...
- mSettings.set("user", "hoge");でuserにhogeを設定
- 設定したタイミングでSQLiteに格納するので、途中でアプリ...
- これらを利用して、入力されたID/パスワードを保存しておき...
また、XMLのパースについては
- RestfulClient.Get(uri, null, mFactory.newDocumentBuilde...
- RestfulClient.RemoveEmptyNodes(result.getDocumentElemen...
- Node.getChildNodes();で、現在のノードの子ノードリストを...
- Node.getNodeName();で欲しいタグ名を探す
- 欲しいタグを見つけたらNode.getFirstChild().getNodeValue...
- これらを利用し、Twitterでの発言内容とユーザ名を取得し、...
- ※android ver1.0時点ではorg.w3c.domパッケージ(?)はバグが...
実際にコーディングしてみます。
package net.it4myself.helloxml;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import net.it4myself.helloxml.R;
import net.it4myself.util.RestfulClient;
import net.it4myself.util.Settings;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class helloXMLActivity extends ListActivity {
private EditText mUsernameEdit;
private EditText mPasswordEdit;
private DocumentBuilderFactory mFactory;
private Settings mSettings;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mUsernameEdit = (EditText)findViewById(R.id.user...
mPasswordEdit = (EditText)findViewById(R.id.pass...
mFactory = DocumentBuilderFactory.newInstance();
mSettings = new Settings(this, null);
String user = mSettings.get("user");
if(null != user){
mUsernameEdit.setText(user);
}
String pass = mSettings.get("pass");
if(null != pass){
mPasswordEdit.setText(pass);
}
Button b1 = (Button)findViewById(R.id.publicTime...
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
RestfulClient.basicAuthUsername = "";
RestfulClient.basicAuthPassword = "";
showTimeline("https://twitter.com/status...
}
});
Button b2 = (Button)findViewById(R.id.myTimeline...
b2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String user = mUsernameEdit.getText().to...
String pass = mPasswordEdit.getText().to...
mSettings.set("user", user);
mSettings.set("pass", pass);
RestfulClient.basicAuthUsername = user;
RestfulClient.basicAuthPassword = pass;
showTimeline("https://twitter.com/status...
}
});
}
private void showTimeline(String uri){
try {
Document result = RestfulClient.Get(uri, null, mFa...
Node removedNode = RestfulClient.RemoveEmptyNodes(...
NodeList statusNodes, l1Nodes, l2Nodes;
Node statusNode, l1Node, l2Node;
List<String> items = new ArrayList<String>();
StringBuilder sb;
statusNodes = removedNode.getChildNodes();
int statusCounter = statusNodes.getLength();
for(int i=0; i < statusCounter; i++){
statusNode = statusNodes.item(i);
sb = new StringBuilder();
l1Nodes = statusNode.getChildNodes();
int l1Counter = l1Nodes.getLength();
for(int ii=0; ii < l1Counter; ii++){
l1Node = l1Nodes.item(ii);
String nodeName = l1Node.getNodeName();
if(nodeName.equals("text")){
Log.v("helloxml", "l1 text node value: " + l1...
sb.append(l1Node.getFirstChild().getNodeValue...
} else if(nodeName.equals("user")){
l2Nodes = l1Node.getChildNodes();
int l2Counter = l2Nodes.getLength();
for(int iii=0; iii < l2Counter; iii++){
l2Node = l2Nodes.item(iii);
String userNodeName = l2Node.getNodeName();
if(userNodeName.equals("name")){
Log.v("helloxml", "l2 name node value: " + l...
sb.append(l2Node.getFirstChild().getNodeValu...
break;
}
}
}
}
items.add(sb.toString());
// Log.v("helloxml", "item base: " + sb.toString());
}
ArrayAdapter<String> itemAdapter = new ArrayAdapte...
setListAdapter(itemAdapter); // ここで渡したアダプ...
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "パスワード合ってる?", Toast....
}
}
}
** 手順7:SQLiteの使い方を追ってみる [#td67fd6b]
- android_utilsプロジェクトのsrcの下のnet.it4myself.util....
- DatabaseHelperクラスを追って、ヘルパークラスを理解する
-- SQLiteOpenHelperクラスを継承したDatabaseHelperクラスを...
-- 初期データとしてseedという名前で、タイムスタンプを元に...
- setメソッドとgetメソッドは、一般的なセッター/ゲッターと...
- hasKeyInDB()を追って、SELECT時の動作を確認する
-- ユーザの入力値に由来する値をSQLに含めるときは、SQLイン...
-- SQLに使いたいパラメータをselectionArgsにまとめます。
-- データベースファイルを壊さないように、SELECT時にはmOpe...
-- qb.query()を実行すると、結果がCursor型で返ってくるので...
- insertToDB()を追って、INSERT時の動作を確認する
-- INSERT文に含める名前と値は、あらかじめContentValuesの...
-- INSERTなど、データベースに書き込みを行うときは、mOpenH...
-- db.insert()を行うとINSERT文が実行され、追加された行数...
- updateDB()とdelete()を追って、それぞれの動作を確認する
-- 基本的な考えはINSERT時と同じです。
-- db.update(TABLE_NAME, values, "key = ?", new String[] ...
** 宿題 [#s14787cf]
- このチュートリアルではタイムラインの取得と表示だけを扱...
- 既にお気づきかも知れませんが、パブリックタイムラインで...
-----
[[勉強会]]
終了行:
[[勉強会]]
* XMLとSQLiteを使用する [#mdc78c0d]
- ※現在レビュー中です。内容は間違いを含んでいる可能性があ...
WebAPIなどから取得したXMLを解析(パース)して、内容を取り出...
DOMはXMLをツリー上に展開し、自由に読み書きできるものの、...
一方、SQLiteについては強力で使いやすく、Web上にもコードを...
ここでは、前のチュートリアルに引き続き、org.w3c.domパッケ...
- 確認中:XMLパーサはorg.w3c.domを使っているという表現で良...
** 手順1:公開されているandroid用のユーティリティのソース...
- [[Androidでorg.apache.http.clientを使用する>勉強会/Http...
- RestfulClientクラスにBASIC認証機能を付けたので、先のチ...
** 手順2:プロジェクトを作成しましょう [#h9cf8a87]
Twitterクライアント用のプロジェクトを作成します。
- "File -> New -> Project"を選択して、開いたダイアログで"...
- 開いたダイアログで、以下のように入力してFinishボタンを...
-- Project Name: HelloXML
-- Package name: net.it4myself.helloxml
-- Activity Name: .HelloXMLActivity
-- Application Name: ハローXML
** 手順3:マニフェストファイルを設定する [#j007d933]
- このプロジェクトではインターネットにアクセスするため、...
- もうソース無くても大丈夫でしょう?
** 手順4:レイアウトを決定する [#x055f760]
- このプロジェクトは2つのレイアウトファイルを使います。
- 画面のレイアウトを決定するために、res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/an...
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="User:"
>
</TextView>
<EditText
android:id="@+id/username_edit_id"
android:layout_width="200px"
android:layout_height="wrap_content"
android:textSize="18sp"
>
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Password:"
>
</TextView>
<EditText
android:id="@+id/password_edit_id"
android:layout_width="200px"
android:layout_height="wrap_content"
android:textSize="18sp"
>
</EditText>
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/publicTimeline_button_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PublicTimeline"
>
</Button>
<Button
android:id="@+id/myTimeline_button_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="My Timeline"
>
</Button>
</LinearLayout>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
</ListView>
</LinearLayout>
- リストの各行のレイアウトのために、res/layout/list_row.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/an...
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
- main.xmlのListViewのidを"@+id/android:list" とするのは...
** 手順5:手順1で作ったプロジェクトをビルドパスに加える [...
- [[Androidでorg.apache.http.clientを使用する>勉強会/Http...
** 手順6:パブリックタイムラインとフレンドタイムラインを...
- ※筆者はTwitterにあまり詳しくないので、用語など間違えて...
- Twitter APIは英文らしいので、[[Twitter API 仕様書 日本...
- Twitterユーザ全体のタイムラインである、パブリックタイム...
- 自分がフォローしている友達だけのタイムラインである、フ...
- 先にブラウザを使ってどんなXMLが返ってくるのか確認してお...
- BASIC認証用にRestfulClientクラスを改良しておいたので、...
** 手順7:パブリックタイムラインとフレンドタイムラインを...
Settingsクラスについては
- mSettings = new Settings(this, null);で生成
- String user = mSettings.get("user");でuserに関連づけて...
- mSettings.set("user", "hoge");でuserにhogeを設定
- 設定したタイミングでSQLiteに格納するので、途中でアプリ...
- これらを利用して、入力されたID/パスワードを保存しておき...
また、XMLのパースについては
- RestfulClient.Get(uri, null, mFactory.newDocumentBuilde...
- RestfulClient.RemoveEmptyNodes(result.getDocumentElemen...
- Node.getChildNodes();で、現在のノードの子ノードリストを...
- Node.getNodeName();で欲しいタグ名を探す
- 欲しいタグを見つけたらNode.getFirstChild().getNodeValue...
- これらを利用し、Twitterでの発言内容とユーザ名を取得し、...
- ※android ver1.0時点ではorg.w3c.domパッケージ(?)はバグが...
実際にコーディングしてみます。
package net.it4myself.helloxml;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import net.it4myself.helloxml.R;
import net.it4myself.util.RestfulClient;
import net.it4myself.util.Settings;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class helloXMLActivity extends ListActivity {
private EditText mUsernameEdit;
private EditText mPasswordEdit;
private DocumentBuilderFactory mFactory;
private Settings mSettings;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mUsernameEdit = (EditText)findViewById(R.id.user...
mPasswordEdit = (EditText)findViewById(R.id.pass...
mFactory = DocumentBuilderFactory.newInstance();
mSettings = new Settings(this, null);
String user = mSettings.get("user");
if(null != user){
mUsernameEdit.setText(user);
}
String pass = mSettings.get("pass");
if(null != pass){
mPasswordEdit.setText(pass);
}
Button b1 = (Button)findViewById(R.id.publicTime...
b1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
RestfulClient.basicAuthUsername = "";
RestfulClient.basicAuthPassword = "";
showTimeline("https://twitter.com/status...
}
});
Button b2 = (Button)findViewById(R.id.myTimeline...
b2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String user = mUsernameEdit.getText().to...
String pass = mPasswordEdit.getText().to...
mSettings.set("user", user);
mSettings.set("pass", pass);
RestfulClient.basicAuthUsername = user;
RestfulClient.basicAuthPassword = pass;
showTimeline("https://twitter.com/status...
}
});
}
private void showTimeline(String uri){
try {
Document result = RestfulClient.Get(uri, null, mFa...
Node removedNode = RestfulClient.RemoveEmptyNodes(...
NodeList statusNodes, l1Nodes, l2Nodes;
Node statusNode, l1Node, l2Node;
List<String> items = new ArrayList<String>();
StringBuilder sb;
statusNodes = removedNode.getChildNodes();
int statusCounter = statusNodes.getLength();
for(int i=0; i < statusCounter; i++){
statusNode = statusNodes.item(i);
sb = new StringBuilder();
l1Nodes = statusNode.getChildNodes();
int l1Counter = l1Nodes.getLength();
for(int ii=0; ii < l1Counter; ii++){
l1Node = l1Nodes.item(ii);
String nodeName = l1Node.getNodeName();
if(nodeName.equals("text")){
Log.v("helloxml", "l1 text node value: " + l1...
sb.append(l1Node.getFirstChild().getNodeValue...
} else if(nodeName.equals("user")){
l2Nodes = l1Node.getChildNodes();
int l2Counter = l2Nodes.getLength();
for(int iii=0; iii < l2Counter; iii++){
l2Node = l2Nodes.item(iii);
String userNodeName = l2Node.getNodeName();
if(userNodeName.equals("name")){
Log.v("helloxml", "l2 name node value: " + l...
sb.append(l2Node.getFirstChild().getNodeValu...
break;
}
}
}
}
items.add(sb.toString());
// Log.v("helloxml", "item base: " + sb.toString());
}
ArrayAdapter<String> itemAdapter = new ArrayAdapte...
setListAdapter(itemAdapter); // ここで渡したアダプ...
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "パスワード合ってる?", Toast....
}
}
}
** 手順7:SQLiteの使い方を追ってみる [#td67fd6b]
- android_utilsプロジェクトのsrcの下のnet.it4myself.util....
- DatabaseHelperクラスを追って、ヘルパークラスを理解する
-- SQLiteOpenHelperクラスを継承したDatabaseHelperクラスを...
-- 初期データとしてseedという名前で、タイムスタンプを元に...
- setメソッドとgetメソッドは、一般的なセッター/ゲッターと...
- hasKeyInDB()を追って、SELECT時の動作を確認する
-- ユーザの入力値に由来する値をSQLに含めるときは、SQLイン...
-- SQLに使いたいパラメータをselectionArgsにまとめます。
-- データベースファイルを壊さないように、SELECT時にはmOpe...
-- qb.query()を実行すると、結果がCursor型で返ってくるので...
- insertToDB()を追って、INSERT時の動作を確認する
-- INSERT文に含める名前と値は、あらかじめContentValuesの...
-- INSERTなど、データベースに書き込みを行うときは、mOpenH...
-- db.insert()を行うとINSERT文が実行され、追加された行数...
- updateDB()とdelete()を追って、それぞれの動作を確認する
-- 基本的な考えはINSERT時と同じです。
-- db.update(TABLE_NAME, values, "key = ?", new String[] ...
** 宿題 [#s14787cf]
- このチュートリアルではタイムラインの取得と表示だけを扱...
- 既にお気づきかも知れませんが、パブリックタイムラインで...
-----
[[勉強会]]
ページ名: