之前寫了gae/j datastore own relationship..
但是一時找不到放哪去!
還是來做個筆記!
實作一對多的例子!
一個帳號會對應到多個留言
先建立一個
data_account.java(這個是父類別)
//省略import
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class data_account {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
private String encodedKey; //編碼的Key,自動產生
@Persistent
@Extension(vendorName="datanucleus" , key="gae.pk-id", value="true")
private Long id; //自動產生
@Persistent
private String account;
@Persistent
private Date date = new Date();
@Persistent(mappedBy = "da") //這裡名稱是對應到data_plurk裡面的data_account xx這個名稱
List data_plurks; //一對多關係的標註
//setter省略
//getter也省略
}
在建立一個data_plurk.java(這個是子類別)
@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class data_plurk {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@Extension(vendorName="datanucleus", key="gae.encoded-pk", value ="true")
private String encodedKey; //編碼的Key,//自動產生
@Persistent
@Extension(vendorName="datanucleus", key="gae.pk-id", value="true")
private Long id;//自動產生
@Persistent
private String content;
@Persistent
@Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
private Key plurkKey; //父類別的設置
@Persistent
private data_account da; //一對一關係的標註
//setter省略
//getter也省略
接著就是做insert的操作了!
建立一個toInsert.java的servlet
public class toInsert extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
data_account da = new data_account();
da.setAccount("test");
da.setDate(new Date());
pm.makePersistent(da);
Key daKey = KeyFactory.stringToKey(da. getEncodedKey());
data_plurk dp1 = new data_plurk();
dp1.setConten("hi");
dp1.setEmployee (da);
dp1.setKey(daKey); //將data_account設為父類別
da.getPlurkSets().add(dp1); //保證data_account的一對多
pm.makePersistent(dp1);
data_plurk dp2 = new data_plurk();
dp2 .setConten("hi");
dp2 .setEmployee (da);
dp2 .setKey(daKey); //將data_account設為父類別
da.getPlurkSets().add(dp2 ); //保證data_account的一對多
pm.makePersistent(dp2 );
}catch(Exception e){
resp.getWriter().println(e.toString());
}finally {
pm.close();
}
}
}
想在android裡面開發有關map應用
必須先去申請map key!
請先打開eclipse
接著點選windows->preferences->android->build
找到Default debug keystore,把位置複製下來。
接著打開cmd..
然後cd 到java/jdk/bin目錄底下,輸入下面指令
keytool.exe -list -alias androiddebugkey -keystore "C:\Users\ken\.android\debug.keystore" -storepass android -keypass android
接著會回傳一段MD5過後的結果!
請複製下來!
接著到
http://code.google.com/intl/zh-TW/android/maps-api-signup.html
此處去登記!
即可得到map API key!!!
(切記!!!上面的紅色的參數,都是Android預設的,也就是說這把key只能用在本機開發測試用!因為要上傳至Android Market會自己create一把key,然後用那把key去sigin and export出來,所以預設的key和自己create的key所產生的md5結果會不同)
android 2.0 以上 app_widget不支援每秒update一次
最小時間是三十分鐘..
這邊利用thread去做到每秒執行很多次...
首先我們要先建立一個widget的設定檔
xml/analog_appwidget.xml
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="146dip"
android:minHeight="146dip"
android:updatePeriodMillis="1000"
android:initialLayout="@layout/analog_appwidget" >
</appwidget-provider>
以及widget的樣式
layout/analog_appwidget.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="efefefefefef">
</TextView>
</LinearLayout>
接著在AndroidMainfest.xml貼入下段
<receiver android:name="AnalogAppWidgetProvider" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/analog_appwidget" />
</receiver>
接著開始寫CODE搂~
AnalogAppWidgetProvider.java
//import省略
public class AnalogAppWidgetProvider extends AppWidgetProvider {
Context context_main ;
AppWidgetManager app_manager;
int []appWidgetId;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
app_manager = appWidgetManager;
context_main = context;
appWidgetId = appWidgetIds;
Thread thread = new Thread(new update_thread());
thread.start();
}
public class update_thread implements Runnable{
@Override
public void run() {
int i = 0;
while(true && i++ <100){
RemoteViews views =
new RemoteViews(context_main.getPackageName(), R.layout.analog_appwidget);
views.setTextViewText(R.id.TextView01, String.valueOf(Math.random()) );
app_manager.updateAppWidget(appWidgetId, views);
}
}
}
}
照著上列步驟即可實現...
如果需要是以每秒去update在自行更改
此範例只是個小sample