GAE/J Datastore Own Relationship 實作

10 May 2010

之前寫了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();
}
}
}


read more »


android map key 申請

03 May 2010


想在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結果會不同)

read more »


android 2.0 以上 app_widget不支援每秒update一次

30 April 2010

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
















read more »