当前位置: 编程技术>移动开发
本页文章导读:
▪公布手机理财2.0.7版 发布手机理财2.0.7版
经过一段时间的开发,现在可以发布2.0.7版本了,包括j2me版和黑莓版!
1 楼
haibing_168
2011-07-09
你的程序在大屏幕上(480*800)显示的字体和按钮.........
▪ Three20 课程和模板 Three20 教程和模板
Three20 是在Facebook 的 iPhone 程序剥离出来的框架,在iPhone OS 的基础上添加了不少强大的特性。
类似RAILS 的ROUTES 功能,能轻松的在各个控制器中切换
类似HTML 的布局方式
强.........
▪ 高焕堂讲授ContentProvider & 范例 高焕堂讲解ContentProvider & 范例
1. 何谓Android的嫡系组件Android有4项一等公民(或称为嫡系亲属),包括:Activity、ContentProvider、IntentReceiver与Service。它们都必须宣告于AndroidManifest.xml档案里,.........
[1]公布手机理财2.0.7版
来源: 互联网 发布时间: 2014-02-18
发布手机理财2.0.7版
经过一段时间的开发,现在可以发布2.0.7版本了,包括j2me版和黑莓版!
经过一段时间的开发,现在可以发布2.0.7版本了,包括j2me版和黑莓版!
1 楼
haibing_168
2011-07-09
你的程序在大屏幕上(480*800)显示的字体和按钮有点儿小呀
[2] Three20 课程和模板
来源: 互联网 发布时间: 2014-02-18
Three20 教程和模板
Three20 是在Facebook 的 iPhone 程序剥离出来的框架,在iPhone OS 的基础上添加了不少强大的特性。
- 类似RAILS 的ROUTES 功能,能轻松的在各个控制器中切换
- 类似HTML 的布局方式
- 强大的HTTP通讯
- 自定义视图外观
可以在 Github 中找到它 , 不过使用教程实在少得可怜。
除了官方提供的两个例子,这里还有几篇:
How to use TTDataSource - http://revetkn.com/?p=62
How to use TTStylesheets - http://mattvague.com/three20-stylesheets-tutorial
How to make custom table cells - http://mattvague.com/three20-custom-cells-iphone-tutorial
提供一个自己封的THREE20模板 ,放到 /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application 下 。打开后修改项目属性中的 Head Path Search 的值为自己320项目的地址即可。
[3] 高焕堂讲授ContentProvider & 范例
来源: 互联网 发布时间: 2014-02-18
高焕堂讲解ContentProvider & 范例
1. 何谓Android的嫡系组件
Android有4项一等公民(或称为嫡系亲属),包括:Activity、ContentProvider、IntentReceiver与Service。它们都必须宣告于AndroidManifest.xml档案里,如下
这让Android知道我们城市里定义了多少个嫡系组件类别;Android可以在启动时就将它们执行起来,成为共享的(Shared)服务组件。这些嫡系服务组件间的沟通,通常是透过「意图」(Intent)物件来请Android转达给对方,Android则会依据意图而找出最佳的配对。配对成功,就展开相互的沟通与服务了。
2. 什么是ContentProvider嫡系组件
---- 以SQLite为例
在Android里,SQLite资料库是最典型的ContentProvider,负责储存各式各样的内容。除了资料库之外,还有许多其他种类的ContentProvider。在这里并不是要介绍这些ContentProvider,而是要透过SQLite认识ContentProvider介面,然后将舶来Linter组件,配上这种ContentProvider介面,让它摇身一变成为Android的嫡系组件。
2.1 一般(即非嫡系)SQLite的范例
没有透过ContentProvider介面来使用SQLite,就是对SQLite的「非嫡系」用法。此时,应用程式透过JDBC介面和SQL语句来与SQLite沟通,以存取资料库里的内容。先认识这种传统用法。此范例将从SQLite读取资料。首先建立一个程式专案,其含有两个Java程式档:ac01.java和DataProvider.java。其中,ac01.java 是典型的Activity类别,负责UI画面的显示工作,而DataProvider则负责与SQLite沟通。其详细程式码为:
指令:
DataProvider dp = new DataProvider(this);
这和一般类别之用法是一样的。 ac01物件指名要诞生一个DataProvider的物件。然后呼叫它,如下指令:
Cursor cur = dp.query(PROJECTION, null, null, null);
这要求SQLite从资料库查询出某些资料。详细的DataProvider.java程式码如下:
这种用法属于非嫡系的用法:在ac01.java程式码里,其指令:
DataProvider dp = new DataProvider(this);
明确指定由DataProvider物件来提供服务。反之,嫡系用法则是透过意图(Intent)来请Android代为配对,进而找出适当的ContentProvider物件来为aco1物件提供服务。
2.2 嫡系SQLite的范例
刚才的范例里,我们直接使用DataProvider类别的介面来与SQLite沟通。本节的范例,将替DataProvider配上ContentProvider介面,让ac01物件能透过ContentProvider新介面来沟通。此范例也是从SQLite资料库读取3笔资料;请仔细看看其程式码的微妙差异:
指令:
Cursor cur = getContentResolver().query(getIntent().getData(),
PROJECTION, null, null, null);
要求Android代为寻找适合的ContentProvider来提供服务,并不刻意指定由DataProvider物件来担任。只要合乎ConentProvider介面,且符合意图条件的物件皆可以来为ac01物件提供服务。于是,ac01程式码就不再直接呼叫DataProvider类别的函数了,而是呼叫ContentProvider介面所提供的函数。再来仔细看看DataProvider类别与ContentProvider介面的搭配情形:
类别定义:
public class DataProvider extends ContentProvider {
// …..…..
}
DataProvider类别继承ContentProvider父类别,也继承了它的介面定义。 ContentProvider介面定义了多个函数,主要包括:
l query()函数---- 它查询出合乎某条件的资料。
l insert()函数---- 它将存入一笔新资料。
l delete()函数---- 它删除合乎某条件的资料。
l update()函数---- 更新某些笔资料的内容。
在这个DataProvider类别里,撰写了query()函数内的指令,来实现query()介面,这个query()函数实际呼叫SQLite资料库的功能。也就是说,ac01等应用程式透过ContentProvider介面间接呼叫到DataProvider的query()函数,然后此query()函数才使用SQLite的服务。
由于此范例的DataProvider已经是ContentProvider嫡系身份了,必须由Android来启动它,而不是有ac01等应用程式来直接启动它,所以必须在AndroidManifest.xml文档里给Android一些指示,如下:
这特别说明DataProvider是一个ContentProvider,于是Android就会来启动它。
1. 何谓Android的嫡系组件
Android有4项一等公民(或称为嫡系亲属),包括:Activity、ContentProvider、IntentReceiver与Service。它们都必须宣告于AndroidManifest.xml档案里,如下
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.misoo.SQ03"> <uses-permission xmlns:android="http://schemas.android.com/apk/res/android" android:name="android.permission.INTERNET"> </uses-permission> <application android:icon="@drawable/icon" android:label="@string/app_name"> <provider android:name="DataProvider" android:authorities="com.misoo.provider.SQ03"> </provider> <activity android:name=".ac01" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".DispActivity" android:label="DispActivity"> </activity> </application> </manifest>
这让Android知道我们城市里定义了多少个嫡系组件类别;Android可以在启动时就将它们执行起来,成为共享的(Shared)服务组件。这些嫡系服务组件间的沟通,通常是透过「意图」(Intent)物件来请Android转达给对方,Android则会依据意图而找出最佳的配对。配对成功,就展开相互的沟通与服务了。
2. 什么是ContentProvider嫡系组件
---- 以SQLite为例
在Android里,SQLite资料库是最典型的ContentProvider,负责储存各式各样的内容。除了资料库之外,还有许多其他种类的ContentProvider。在这里并不是要介绍这些ContentProvider,而是要透过SQLite认识ContentProvider介面,然后将舶来Linter组件,配上这种ContentProvider介面,让它摇身一变成为Android的嫡系组件。
2.1 一般(即非嫡系)SQLite的范例
没有透过ContentProvider介面来使用SQLite,就是对SQLite的「非嫡系」用法。此时,应用程式透过JDBC介面和SQL语句来与SQLite沟通,以存取资料库里的内容。先认识这种传统用法。此范例将从SQLite读取资料。首先建立一个程式专案,其含有两个Java程式档:ac01.java和DataProvider.java。其中,ac01.java 是典型的Activity类别,负责UI画面的显示工作,而DataProvider则负责与SQLite沟通。其详细程式码为:
package com.misoo.pklx; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; public class ac01 extends ListActivity { private static final String[] PROJECTION = new String[] { "stud_no", "stud_name" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DataProvider dp = new DataProvider(this); Cursor cur = dp.query(PROJECTION, null, null, null); ArrayList<Map<String, Object>> coll = new ArrayList<Map<String, Object>>(); Map<String, Object> item; cur.moveToFirst(); while(!cur.isAfterLast()) { item = new HashMap<String, Object>(); item.put("c1", cur.getString(0) + ", " + cur.getString(1)); coll.add(item); cur.moveToNext(); } dp.close(); this.setListAdapter(new SimpleAdapter(this, coll, android.R.layout.simple_list_item_1, new String[] { "c1" }, new int[] {android.R.id.text1})); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { finish(); }}
指令:
DataProvider dp = new DataProvider(this);
这和一般类别之用法是一样的。 ac01物件指名要诞生一个DataProvider的物件。然后呼叫它,如下指令:
Cursor cur = dp.query(PROJECTION, null, null, null);
这要求SQLite从资料库查询出某些资料。详细的DataProvider.java程式码如下:
package com.misoo.pklx; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.util.Log; public class DataProvider { private static final String DATABASE_NAME = "StudDB"; private static final String TABLE_NAME = "Student"; private final int DB_MODE = Context.MODE_PRIVATE; private SQLiteDatabase db=null; public DataProvider(Context ctx) { try { db = ctx.openOrCreateDatabase(DATABASE_NAME, DB_MODE, null); } catch (Exception e) { Log.e("ERROR", e.toString()); return; } try { db.execSQL("drop table "+ TABLE_NAME); } catch (Exception e) { Log.e("ERROR", e.toString()); } db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + "stud_no" + " TEXT," + "stud_name" + " TEXT" + ");"); String sql_1 = "insert into "+ TABLE_NAME + " (stud_no, stud_name) values('S101', 'Lily');"; String sql_2 = "insert into " + TABLE_NAME + " (stud_no, stud_name) values('S102', 'Linda');"; String sql_3 = "insert into " + TABLE_NAME + " (stud_no, stud_name) values('S103', 'Bruce');"; try { db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); } catch (SQLException e) { Log.e("ERROR", e.toString()); return; } } public Cursor query(String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor cur = db.query(TABLE_NAME, projection, null, null, null, null, null); return cur; } public void close(){ db.close(); } }
这种用法属于非嫡系的用法:在ac01.java程式码里,其指令:
DataProvider dp = new DataProvider(this);
明确指定由DataProvider物件来提供服务。反之,嫡系用法则是透过意图(Intent)来请Android代为配对,进而找出适当的ContentProvider物件来为aco1物件提供服务。
2.2 嫡系SQLite的范例
刚才的范例里,我们直接使用DataProvider类别的介面来与SQLite沟通。本节的范例,将替DataProvider配上ContentProvider介面,让ac01物件能透过ContentProvider新介面来沟通。此范例也是从SQLite资料库读取3笔资料;请仔细看看其程式码的微妙差异:
package com.misoo.pkrr; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import android.app.ListActivity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; public class ac01 extends ListActivity { public static int g_variable; public static final String AUTHORITY = "com.misoo.provider.rx09-02"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/Student"); private static final String[] PROJECTION = new String[]{ "stud_no", "stud_name"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); if (intent.getData() == null) intent.setData(CONTENT_URI); Cursor cur = getContentResolver().query(getIntent().getData(), PROJECTION, null, null, null); ArrayList<Map<String, Object>> coll = new ArrayList<Map<String, Object>>(); Map<String, Object> item; cur.moveToFirst(); while (!cur.isAfterLast()) { item = new HashMap<String, Object>(); item.put("c1", cur.getString(0) + ", " + cur.getString(1)); coll.add(item); cur.moveToNext(); } this.setListAdapter(new SimpleAdapter(this, coll, android.R.layout.simple_list_item_1, new String[] { "c1" }, new int[] { android.R.id.text1 })); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { finish();} }
指令:
Cursor cur = getContentResolver().query(getIntent().getData(),
PROJECTION, null, null, null);
要求Android代为寻找适合的ContentProvider来提供服务,并不刻意指定由DataProvider物件来担任。只要合乎ConentProvider介面,且符合意图条件的物件皆可以来为ac01物件提供服务。于是,ac01程式码就不再直接呼叫DataProvider类别的函数了,而是呼叫ContentProvider介面所提供的函数。再来仔细看看DataProvider类别与ContentProvider介面的搭配情形:
package com.misoo.pkrr; import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; import android.util.Log; public class DataProvider extends ContentProvider { private static final String DATABASE_NAME = "StudNewDB"; private static final int DATABASE_VERSION = 2; private static final String TABLE_NAME = "StudTable"; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + "stud_no" + " TEXT," + "stud_name" + " TEXT" + ");"); String sql_1 = "insert into " + TABLE_NAME + " (stud_no, stud_name) values('S1001', 'Pam');"; String sql_2 = "insert into " + TABLE_NAME + " (stud_no, stud_name) values('S1002', 'Steve');"; String sql_3 = "insert into " + TABLE_NAME + " (stud_no, stud_name) values('S1003', 'John');"; try { db.execSQL(sql_1); db.execSQL(sql_2); db.execSQL(sql_3); } catch (SQLException e) { Log.e("ERROR", e.toString()); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} } // --------------------------------------------- private DatabaseHelper mOpenHelper; @Override public boolean onCreate() { mOpenHelper = new DatabaseHelper(getContext()); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { SQLiteDatabase db = mOpenHelper.getReadableDatabase(); Cursor c = db.query(TABLE_NAME, projection, null, null, null, null, null); return c; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues initialValues) { return uri; } @Override public int delete(Uri uri, String where, String[] whereArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String where, String[] whereArgs) { return 0; } }
类别定义:
public class DataProvider extends ContentProvider {
// …..…..
}
DataProvider类别继承ContentProvider父类别,也继承了它的介面定义。 ContentProvider介面定义了多个函数,主要包括:
l query()函数---- 它查询出合乎某条件的资料。
l insert()函数---- 它将存入一笔新资料。
l delete()函数---- 它删除合乎某条件的资料。
l update()函数---- 更新某些笔资料的内容。
在这个DataProvider类别里,撰写了query()函数内的指令,来实现query()介面,这个query()函数实际呼叫SQLite资料库的功能。也就是说,ac01等应用程式透过ContentProvider介面间接呼叫到DataProvider的query()函数,然后此query()函数才使用SQLite的服务。
由于此范例的DataProvider已经是ContentProvider嫡系身份了,必须由Android来启动它,而不是有ac01等应用程式来直接启动它,所以必须在AndroidManifest.xml文档里给Android一些指示,如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.misoo.pkrr" android:versionCode="1" android:versionName="1.0.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ac01" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <provider android:name="DataProvider" android:authorities="com.misoo.provider.rx09-02"> </provider> </application> </manifest>
这特别说明DataProvider是一个ContentProvider,于是Android就会来启动它。
最新技术文章: