Code

显示标签为“Android”的博文。显示所有博文
显示标签为“Android”的博文。显示所有博文

2011年6月12日星期日

iCreate: Progress 3

跟小猫某次大吵之后,发现我的确有点自私。为了一小小的比赛项目,强占小猫这么多时间,这些时间本来是应该作为考试之后relax的,结果整天被我催促着,换作是谁也都受不了。还是等小猫回来之后有时间在做点简单的部分吧。
这段时间基本上就是我一个人做这个project了。我把windows7删掉了,换了ubuntu11.04。本来的目的不是为了project,因为我玩游戏有点上瘾,想在ub上没什么游戏玩所以就换了系统。用了几天之后发现ub相当好用,不但没费什么功夫就把所有平常要用的东西装好了,比如输入法,而且新的unity UI用起来也是相当的cool。值得一提的是预装的libreOffice跟MS office用户体验已经差不多了。我用了一下libreCalc (aka. MS excel), 所有界面都差不多,计算功能也是一样的,相当好。有点扯远了,我想说的是在ub 11.04上编程是非常爽的一件事情。不会有在Windows下那么多的config, 很多compiler也都有预装。eclipse 在ub下运行完美无缺,很容易的装了Android SDK和ADT。最近想玩玩zeromq就装了个cdt plugin,一切都是那么顺利。git也是很容易就装上了。linux的一大优点是什么东西都可以在terminal里跑,万能的terminal啊。
装好android 环境之后我很快的就继续了iCreate。我把database 用sqlite database browser制作好,然后直接从asset folder拷贝到db folder。为了尽量的减少db io, 我用了一个cache class,一开始就把所有会用到的node都load到memory然后进行处理。显然这样会占用大量内存,但鉴于nus的节点是有限的,如果一个节点30 B,100节点是3kB还行吧。其实最占内存的是地图,为了能在上面做overlay,我需要一个temp bitmap它的大小需要跟原地图一样,这样我的内存使用量就翻倍了导致我不能再avd上用高res的地图。虽然在手机上可以。我的想法是先做出来看看吧,优化留给以后吧。
我在地图里放几个com1 到 central library的节点,还有从com2到computer center的所有车站。然后写了pathfinder class。基本上是可以找出正确的路线的。
但我跟小猫上次讨论了使用A*同时计算走路路线和坐车路线是不行的,所以在现有的基础上我把坐车路线的算法分离开了。我现在会同时计算两条路线走路和坐车,有点像google吧。这个我昨晚把它实现了,因为数据还不完全,所以还没有测试。


另外,我制作了一个listview放在主页下面的空位上来显示搜索到的路线。我觉得这样UI显得紧凑一点。然后也加入了自己定位的部分,系统会自动列出靠近的地点供用户选择。
如果pathfinding测试没什么问题,剩下的事情就是在地图上label路线了。我们需要一些标记图片来表起点终点,和路线,类似google map上的那些气球。
可能UI还需要修改,这些等小猫回来在讨论。
git上的repo我也整理了一下,现在只剩下一个icreate的repo。之前我不小心把新写的code都删掉了没有backup,结果花了一晚上重写所有的改动。现在学乖了,要经常git push。

 In essence, the Linux kernel is a bundle of device drivers that
communicate with hardware and reveal themselves as a file system.

2011年5月30日星期一

如何预制并使用sqlite database

我的项目里需要做一个数据库储存很多节点信息。显然如果在runtime的时候从原始数据文件载入到数据库会相当耗时,我采取的方法是事先在电脑上生成一个.db的sqlite数据库文件,然后在拷贝到android 项目里面。具体做法如下:
1. 使用 sqlite database browser 创建数据库及表。

2. 创建表的时候需要有一列_id,可以创建一列或者把原有的primary key改名。这是android对数据库的要求,因为它自己的content provider需要用到这个。
3. 生成 android_metadata 表, 这个表让这个数据库被android 识别
   CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')
   INSERT INTO "android_metadata" VALUES ('en_US')    保存。

4. 拷贝生成的.db数据库文件到项目的asset 文件夹下, 建立databaseHelper:
注意:your_package 需要是以com.xxx.xxx的形式, DB_NAME需要是xxx.db的形式。
public class DataBaseHelper extends SQLiteOpenHelper{

    //The Android's default system path of your application database.
    private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
    private static String DB_NAME = "myDBName";
    private SQLiteDatabase myDataBase; 
    private final Context myContext;
    public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);

        this.myContext = context;
    }
    public void createDataBase() throws IOException{
        boolean dbExist = checkDataBase();

        if(dbExist){

             //do nothing - database already exist

        }else{
             this.getReadableDatabase();

        try {
             copyDataBase(); 
        } catch (IOException e) {
             throw new Error("Error copying database");
        }
        }
    }
    private boolean checkDataBase(){
SQLiteDatabase checkDB = null;

try{

String myPath = DB_PATH + DB_NAME;

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}catch(SQLiteException e){
//database does't exist yet.
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;

    }
    private void copyDataBase() throws IOException{

    
//Open your local db as the input stream

InputStream myInput = myContext.getAssets().open(DB_NAME);

// Path to the just created empty db

String outFileName = DB_PATH + DB_NAME;

//Open the empty db as the output stream

OutputStream myOutput = new FileOutputStream(outFileName);

//transfer bytes from the inputfile to the outputfile

byte[] buffer = new byte[1024];

int length;

while ((length = myInput.read(buffer))>0){

myOutput.write(buffer, 0, length);

}

//Close the streams

myOutput.flush();

myOutput.close();

myInput.close();

    }
    public void openDataBase() throws SQLException{
//Open the database

        String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }
    @Override
public synchronized void close() {

    if(myDataBase != null)

    myDataBase.close();

    super.close();

}

@Override

public void onCreate(SQLiteDatabase db) {

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}

5. 在项目activity里测试:

        DataBaseHelper myDbHelper = new DataBaseHelper();
        myDbHelper = new DataBaseHelper(this);

        try {
myDbHelper.createDataBase();

} catch (IOException ioe) {

throw new Error("Unable to create database");

}

try {

myDbHelper.openDataBase();

}catch(SQLException sqle){

throw sqle;

}


注:可去原网站查看。