2011年12月14日水曜日

[iOS]CoreDataで検索結果が取得できないバグ

CoreDataを使用したアプリを作成中に

検索結果が取得できないという現象が起きた
発生状況として
検索A>検索B>検索Aとすると結果が取得できない
検索B>検索A>検索Aとすると結果が取得できない
検索A>検索A>検索Aとすると結果が取得できる
検索A>検索C>検索Aとすると結果が取得できる

結果として検索条件を変えることで取得ができるようになった
変更前
NSString *predStr = @"number == '1'";
NSPredicate *pred = [NSPredicate predicateWithFormat: predStr];
変更後
NSString *predStr = @"number == 1";
NSPredicate *pred = [NSPredicate predicateWithFormat: predStr];


シングルクォートを外しただけ
numberは数値方(Int32)なので「そらそうだ」と思ったが
検索の順番を変更すると取得できたりできなかったりするのが謎

2011年12月7日水曜日

[AndroidSDK]iPhoneのナビゲーションバー、ツールバーっぽいバー

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <!-- ナビゲーションバー、ツールバーのカラー -->
    <gradient

        android:startColor="#FFFFFF"
        android:centerColor="#FF0000"
        android:endColor="#FFFFFF"
        android:angle="270"
    />
    <size

        android:height="40dp"
    />
</shape>


main.xml

    <!--ナビゲーションバー-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="44dp"
        android:background="@layout/toolbar"
        >
    </LinearLayout>

「戻る」ボタンが欲しい時はLinearLayoutの中に入れればいい

ところでandroidのこのxmlの形式
どこで改行を入れるか、段落区切りはどうするか?という問題がある
まともにXML準拠すると非常に運用しにくい
UIで扱うGraphical Layoutはまともに使えないしね

なのでこの記事でのXML表記はかなり適当になっている。

2011年12月2日金曜日

[AndroidSDK]android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

AndroidのSqliteで以下のエラーが発生した。

android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

条件が誤っています、ということで、
Primary keyに重複した値を入れていた、型エラー、カラム名の間違いとかでも出るかもしれない。

クエリが長く原因がわかりにくい時は、一度AndroidからDBをPCに持ってきて
SQLite Managerなどで条件文を確認すると原因が分かりやすいかも

2011年12月1日木曜日

[AndroidSDK]JSONの書き込み

JSONを使用すると、アプリの細かな情報を簡単にストレージに保存できる
iPhoneでいうところplist的な扱いができる
やたらソース長いので短くしたいところ

//ファイルの有無を確認
FileInputStream fileInputStream;
JSONObject jsono = null;
try {
    fileInputStream = openFileInput("profile.json");
    int size = fileInputStream.available();
    byte[] buffer = new byte[size];
    fileInputStream.read(buffer);
    fileInputStream.close();
    String jsnoString = new String(buffer);
    jsono = new JSONObject(jsnoString);
   
} catch (FileNotFoundException e) {
    log("FileNotFoundException "+e);
    //ファイルが存在しないので作成する
    try {
        jsono = new JSONObject();
        jsono.put("hogeInt", 2);
        jsono.put("hogeBool", false);
        jsono.put("hogeString", "foo");
       
        try {
            //ファイルを書き込む
            FileOutputStream fileOutputStream;
            fileOutputStream = openFileOutput("profile.json", MODE_PRIVATE);
            String value = jsono.toString();
            fileOutputStream.write(value.getBytes());
            fileOutputStream.close();
           
        } catch (FileNotFoundException e1) {
            log("FileNotFoundException "+e1);
           
        } catch (IOException e1) {
            log("IOException "+e1);
        }
       
    } catch (JSONException e1) {
        log("JSONException "+e1);
    }
} catch (IOException e) {
    log("JSONException "+e);
   
} catch (JSONException e) {
    log("IOException "+e);
}

try {
    jsono.put("hogeBool", true);
} catch (JSONException e1) {
    log("JSONException "+e1);
}

//ファイルを書き込む
try {
    FileOutputStream fileOutputStream;
    fileOutputStream = openFileOutput("profile.json", MODE_PRIVATE);
    fileOutputStream.write(jsono.toString().getBytes());
    fileOutputStream.close();
   
} catch (FileNotFoundException e1) {
    log("FileNotFoundException "+e1);
   
} catch (IOException e1) {
    log("IOException "+e1);
}