スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SQLiteアクセス時のオープンモード

続きを読む

スポンサーサイト

SQLiteのPHPとC言語での比較

クエリーでソース量の比較をしてみた

PHP
<?php

$db = new SQLite3('/home/user/sqlite-c/stations.sqlitedb', SQLITE3_OPEN_READONLY);

$sql = "SELECT station FROM station_info";

$rows = $db->query($sql);
if (!$rows) {
        $db->close();
        die('クエリーが失敗しました。');
}

//結果を1行ずつ処理する
while ($row = $rows->fetchArray(SQLITE3_ASSOC)) { 
        print('station='.$row['station']."\n");
}
//終了
$db->close();
?>

C言語で記述すると
#include <sqlite3.h>
#include <stdio.h>

int main(void) {
        int rc;
        char *sql;
        sqlite3 *db;
        sqlite3_stmt *stmt=NULL;

        rc = sqlite3_open("/home/user/sqlite-c/stations.sqlitedb", &db);

        if (rc != SQLITE_OK) {
                printf("Cannot open database: %s\n", sqlite3_errmsg(db));
                sqlite3_close(db);
                return 1;
        }

        // stmtの内部バッファクリア
        sqlite3_reset(stmt);

        // stmt を生成する
        sql = "SELECT station FROM station_info";
        rc = sqlite3_prepare(db, sql, strlen(sql), &stmt, NULL);
        if (rc != SQLITE_OK){
                printf("クエリーが失敗しました。\n");
                sqlite3_finalize(stmt);
                sqlite3_close(db);
                return 1;
        }

        // 結果を1行ずつ処理する
        while (SQLITE_ROW == (rc=sqlite3_step(stmt))){
                printf("station=%s\n", sqlite3_column_text(stmt, 0));
        }

        if (rc != SQLITE_DONE){
                printf("クエリーが失敗しました。\n");
                sqlite3_finalize(stmt);
                sqlite3_close(db);
                return 1;
        }

        // stmt を開放
        sqlite3_finalize(stmt);
        sqlite3_close(db);

}
やっぱりC言語の方がコード量が多い。
ところでPHPでのSQLITE3_OPEN_READONLYはCではどう記述するんだろ。

SQLiteをC言語で

ドキュメントは以下のサイト
http://www.sqlite.org/capi3ref.html

以下のURLも参考になった
http://zetcode.com/db/sqlitec/


動作環境は、QEMU ARM 環境、debian 6.0 (squeeze)
Windows7上で動かしている

開発ライブラリのインストール
# apt-get install libsqlite3-dev
Connectだけの動作確認 ファイル名= SQLiteConnect.c
#include <sqlite3.h> 
#include <stdio.h> 

int main(void) {
    sqlite3 *db;
    int rc;

    rc = sqlite3_open("/home/user/sqlite-c/stations.sqlitedb", &db);
    
    if (rc != SQLITE_OK) {
        
        printf("Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    } else {
        printf("database connected.\n");
    }

    sqlite3_close(db);

}
コンパイル
$ gcc -o SQLiteConnect SQLiteConnect.c -lsqlite3 -std=c99
実行
$ ./SQLiteConnect
database connected.
ついでに Makefile
TARGET  = SQLiteConnect

SRCS    := SQLiteConnect.c
OBJS    := $(SRCS:.c=.o)

CC      = gcc
CFLAGS  = -std=c99
INCLUDE = 
LIBS    = -lsqlite3

$(TARGET): $(OBJS)
        $(CC) -o $@ $(OBJS) $(LIBS)

.c.o:
        $(CC) -c $< $(CFLAGS) $(INCLUDE)

オフライン地図アプリを作る

Osmdroidでoffline Mapを作っている人がいた。
https://github.com/HondaDai/OfflineMap-based-on-Osmdroid

このofflinemap-android.jarを用いたサンプルソースは、
・osmdroid-android 3.0.5
・slf4j-android 1.5.8
というバージョンで動作するとある。

なお、あらかじめ地図データを加工してSDカードに保存する必要がある。
Mobile_Atlas_Creator_1.8_SQLiteというツールを使う。
Google MapsとOpen Street Maps などに対応しているらしい。

でも地図表示だけでなくマーカー表示も行いたい。
osmdroidでマーカーを使うには、OSMBonusPackというライブラリを使う必要があるらしく、使えるバージョンは、4.1以降と記述があった。以下の関係になっているようである。
OSMBonusPack jars from v5.1 are based on osmdroid v4.3
OSMBonusPack jars from v4.5 to v5.0 are based on osmdroid v4.2
OSMBonusPack jars from v4.2.6 to v4.4 are based on osmdroid v4.1

このため、ググって、以下のファイルをダウンロードした
osmdroid-android-4.1.jar
http://grepcode.com/snapshot/repo1.maven.org/maven2/org.osmdroid/osmdroid-android/4.1

slf4j-android-1.6.1-RC1.jar
http://www.slf4j.org/android/

osmbonuspack_v4.4.jar
https://github.com/MKergall/osmbonuspack/releases

これらをEclipseの「外部Jarの追加」でjarファイルを入れ替える(osmbonuspack_v4.4.jarは新規追加)

更に、解説にある通りにリソースも追加する(OSMBonusPack サンプルソースにファイルがある)

[res/layout]
・bonuspack_bubble.xml

[res/drawable-mpi]
・bonuspack_bubble.9.png
・moreinfo_arrow.png
・moreinfo_arrow_pressed.png
・btn_moreinfo.xml

osmbonuspackのマーカーのコードは以下のURLを参考にした。
https://code.google.com/p/osmbonuspack/wiki/Tutorial_0
http://osmbonuspack.googlecode.com/svn/trunk/OSMBonusPackTuto/src/com/example/osmbonuspacktuto/MainActivity.java

出来上がったソース
package idv.hondadai.offlinemapdemo;

import idv.hondadai.offlinemap.views.OfflineMapView;

import org.osmdroid.bonuspack.overlays.Marker; // マーカー

import org.osmdroid.api.IMapController;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;


public class OfflineMapDemoActivity extends Activity {
	// layout
	private RelativeLayout mapLayout;

	// MapView
	private MapView mapView;
	private IMapController mapController; // 4.1からMapControllerからIMapControllerへ

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// init Layout
		setContentView(R.layout.main);
		this.mapLayout = (RelativeLayout) findViewById(R.id.mapLayout);

		// init Offline Map
		this.mapView = new OfflineMapView(this, "GoogleMapCH.sqlitedb");
		this.mapController = mapView.getController();

		// set Zoom Countrol
		this.mapView.setBuiltInZoomControls(true);

		// set Touch Control
		this.mapView.setMultiTouchControls(true);

		// zoom to 17
		this.mapController.setZoom(17);

		//add mapview
		this.mapLayout.addView(this.mapView, new RelativeLayout.LayoutParams(
				android.view.ViewGroup.LayoutParams.FILL_PARENT,
				android.view.ViewGroup.LayoutParams.FILL_PARENT));

		// 三田駅,35.64791434,139.74887785
		GeoPoint geoPoint = new GeoPoint((int)(35.64791434 * 1E6), (int)(139.74887785 * 1E6));
		this.mapController.setCenter(geoPoint);
		

		//0. Using the Marker overlay
		Marker startMarker = new Marker(this.mapView);
		startMarker.setPosition(geoPoint);
		startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
		startMarker.setTitle("Start point");
		startMarker.setDraggable(true);
		this.mapView.getOverlays().add(startMarker);		
		
	}
}
出来上がったアプリ画面
device-2015-10-02-191308.png
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。