Hatena::ブログ(Diary)

_development, RSSフィード Twitter

2012-09-18

SQLite JDBC Driver for Android

SQLiteJDBC経由でアクセスする方法です。


OracleのサイトにあるBuilding the Android JDBC Driverの方法に従って、sqlite.jarビルドします。


その際、以下の手順はとばします。

To do this, edit <db>/lang/sql/jdbc/SQLit/Database.java and replace all instances of System.loadLibrary("sqlite_jni") with  System.loadLibrary("oracle-jdbc").

ビルドが完了したら

/build_unix/jdbc/sqlite.jar

アプリケーションのlibsにコピーすれば準備完了です。


以下は上記サイトのサンプル・アプリケーションを少し変更したサンプルです。

主要な変更点は

  • DatabaseUtils.createDbFromSqlStatements()でデータベースを作成。これをしないとDriverManager.getConnection()でエラーになります。
  • データベースのパスをContext.getDatabasePath()で取得。

の2点です。

String databaseName = "example.db";
DatabaseUtils.createDbFromSqlStatements(this, databaseName, 1, "");
final String url = "jdbc:sqlite:/" + getDatabasePath(databaseName);

package com.example.sqlitejdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import android.app.Activity;
import android.database.DatabaseUtils;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

    /*
     * This is the main entrance/body of our sample program. This
     * example illustrates all of the major API usages.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final TextView tv = new TextView(this);
        tv.setText("App Started");
        setContentView(tv);

        System.out.println("Appstart: ");

        execSQLs(tv);
    }
    
    

    private void execSQLs(final TextView tv) {
        String databaseName = "example.db";
        
        DatabaseUtils.createDbFromSqlStatements(this, databaseName, 1, "");
        
        final String url = "jdbc:sqlite:/" + getDatabasePath(databaseName);

        
        Connection con;
        String dropString = "drop table if exists COFFEES";
        String createString;
        createString = "create table COFFEES " + "(COF_NAME varchar(32), " + "SUP_ID int, " + "PRICE float, " + "SALES int, " + "TOTAL int)";
        String insertString = "drop table COFFEES if exisits";
        String query = "select COF_NAME, PRICE from COFFEES";
        Statement stmt;

        try {
            Class.forName("SQLite.JDBCDriver");

        } catch (java.lang.ClassNotFoundException e) {
            final String out = "ClassNotFoundException: " + e.getMessage();
            tv.setText(tv.getText() + "\n" + out);
            
            return;
        }

        try {
            con = DriverManager.getConnection(url, "", "");


            stmt = con.createStatement();
            stmt.executeUpdate(dropString);
            stmt.executeUpdate(createString);
            stmt.close();

            stmt = con.createStatement();
            stmt.executeUpdate("insert into COFFEES " + "values('Colombian', 00101, 7.99, 0, 0)");

            stmt.executeUpdate("insert into COFFEES " + "values('French_Roast', 00049, 8.99, 0, 0)");

            stmt.executeUpdate("insert into COFFEES " + "values('Espresso', 00150, 9.99, 0, 0)");

            stmt.executeUpdate("insert into COFFEES " + "values('Colombian_Decaf', 00101, 8.99, 0, 0)");

            stmt.executeUpdate("insert into COFFEES " + "values('French_Roast_Decaf', 00049, 9.99, 0, 0)");

            ResultSet rs = stmt.executeQuery(query);

            System.out.println("Coffee Break Coffees and Prices:");
            while (rs.next()) {
                String s = rs.getString("COF_NAME");
                float f = rs.getFloat("PRICE");
                final String out = s + "   " + f;
                tv.setText(tv.getText() + "\n" + out);
            }
            stmt.close();
            con.close();

        } catch (SQLException ex) {
            ex.printStackTrace();
            final String out = "SQLException: " + ex.getMessage();
            tv.setText(tv.getText() + "\n" + out);
        }

    }
}

というわけでJDBC接続ができたので、DbUnitテストケースをAndroidTestCaseを継承するようにしてみました。


以上です。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/esmasui/20120918/1347985333
リンク元