質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Android

    6504questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Eclipse

    1655questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • SQLite

    618questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

assets内のDBからのデータの読み込みが出来ない

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,051

heyasumi411

score 3

http://y-anz-m.blogspot.jp/2011/01/android-sqline-database.html
こちらの方のコードを元にassetsに格納したDBからデータを呼び出す方法を用いたのですが、一覧表示を行おうとすると強制終了してしまいました。
logcatを確認してみると
「Caused by: android.database.sqlite.SQLiteException: no such table: Item (code 1): , while compiling: SELECT * FROM Item」
といったログがあったため、正常にDBが読み込まれていないのかなと思いました。

恐らくDBのコピーが正常に行われていないと思い確認してみたのですがいまいちどこが原因なのかがわかりませんでした。
是非ご教授ください。

public class MyOpenHelper extends SQLiteOpenHelper {
    private static String DB_NAME = "LocationDB.db";  
    private static String DB_NAME_ASSET = "LocationDB.db";  
    private static final int DATABASE_VERSION = 17;  

    private SQLiteDatabase mDatabase;  
    private final Context mContext;  
    private final File mDatabasePath;  

    public MyOpenHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);  
        mContext = context;  
        mDatabasePath = mContext.getDatabasePath(DB_NAME);  
    }  

    /** 
     * asset に格納したデータベースをコピーするための空のデータベースを作成する 
     */  
    public void createEmptyDataBase() throws IOException {  
        boolean dbExist = checkDataBaseExists();  
        if (dbExist) {  
            // すでにデータベースは作成されている  
        } else {  
            // 空のデータベースをデフォルトシステムパスに作成
            SQLiteDatabase db_Read = this.getReadableDatabase();
            db_Read.close();

            try {  
                // asset に格納したデータベースをコピーする  
                copyDataBaseFromAsset();  

                String dbPath = mDatabasePath.getAbsolutePath();  
                SQLiteDatabase checkDb = null;  
                try {  
                    checkDb = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READWRITE);  
                } catch (SQLiteException e) {  
                }  

                if (checkDb != null) {  
                    checkDb.setVersion(DATABASE_VERSION);  
                    checkDb.close();  
                }  

            } catch (IOException e) {  
                throw new Error("Error copying database");  
            }  
        }  
    }   

    /** 
     * 再コピーを防止するために、すでにデータベースがあるかどうか判定する 
     * 
     * @return 存在している場合 {@code true} 
     */  
    private boolean checkDataBaseExists() {  
        String dbPath = mDatabasePath.getAbsolutePath();  

        SQLiteDatabase checkDb = null;  
        try {  
            checkDb = SQLiteDatabase.openDatabase(dbPath, null, SQLiteDatabase.OPEN_READONLY);  
        } catch (SQLiteException e) {  
            // データベースはまだ存在していない  
        }  

        if (checkDb == null) {  
            // データベースはまだ存在していない  
            return false;  
        }  

        int oldVersion = checkDb.getVersion();  
        int newVersion = DATABASE_VERSION;  

        if (oldVersion == newVersion) {  
            // データベースは存在していて最新  
            checkDb.close();  
            return true;  
        }  

        // データベースが存在していて最新ではないので削除  
        File f = new File(dbPath);  
        f.delete();  
        return false;  
    }  

    /** 
     * asset に格納したデーだベースをデフォルトのデータベースパスに作成したからのデータベースにコピーする 
     */  
    private void copyDataBaseFromAsset() throws IOException{  

        // asset 内のデータベースファイルにアクセス  
        InputStream mInput = mContext.getAssets().open(DB_NAME_ASSET);  

        // デフォルトのデータベースパスに作成した空のDB  
        OutputStream mOutput = new FileOutputStream(mDatabasePath);  

        // コピー  
        byte[] buffer = new byte[1024];  
        int size;  
        while ((size = mInput.read(buffer)) > 0) {  
            mOutput.write(buffer, 0, size);  
        }  

        // Close the streams  
        mOutput.flush();  
        mOutput.close();  
        mInput.close();  
    }  

    public SQLiteDatabase openDataBase() throws SQLException {  
        return getReadableDatabase();  
    }  

    @Override  
    public void onCreate(SQLiteDatabase db) {  
    }  

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

    @Override  
    public synchronized void close() {  
        if(mDatabase != null)  
            mDatabase.close();  

            super.close();  
    }  
}  
public class sdb extends Activity {  
     protected SQLiteDatabase db;
     protected Cursor cursor;
     protected ListAdapter adapter;
     protected ListView cigaretteList;
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.showdatabase);
      db = (new MyOpenHelper(this)).getWritableDatabase();
      cigaretteList = (ListView)findViewById(R.id.lvkiso);
      Cursor c = db.query("Item",null, null, null, null, null, null);
      c.moveToFirst();
      cigaretteList.setAdapter(new SimpleCursorAdapter(this, 
                   R.layout.list_item,
                   c, 
                   new String[] {"ID", "Name", "Temp"}, 
                   new int[] {R.id.ID, R.id.Name, R.id.Temp}));
    }  
}  

確認したこと
assets内のDBの中身の確認

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

Assetの中にItemテーブルが存在することは確認したんですね?
それならデータベースにselectを行う直前でデータベースファイルを適当な場所にコピーし、中身を確認してみましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/25 01:54

    selectを行う前(sdb.java)を実行する前にasset内のDBファイルをコピーして中身を確認してみたところ、中身は元のデータベースファイルと同一の内容でした。
    もしかしたらスクリプト内に文章を加えてコピーするということなのかも知れませんが、そういった場合はどのような構文を付け加えるべきでしょうか?

    キャンセル

  • 2017/01/25 02:07

    「もしかしたら」以降の文章の意味がわかりません。

    assetの中のdbファイルが正しいことはわかったので、onCreateのdb.queryの直前でdbファイルをパソコンからアクセスできるパスにコピーしてください。

    キャンセル

  • 2017/01/25 05:17

    とても恥ずかしいのですが、db.queryの直前でdbファイルを出力する方法を調べたところ見当たりませんでした。実機ではなくエミュレータ上で起動している為、SDカードなどに保存するといった方法が取れませんでした。
    一応db.queryの直前でreturnを挿入してsdb.javaを実行した後にコマンドプロンプトを用いて仮想デバイス内のdataフォルダの中身を確認してみたのですが、/data/data/com.example.sqlitesample1/databases/LocationDB.dbは存在しないと返ってきました。

    キャンセル

  • 2017/01/25 09:59

    assetからdata/data/com.example.sqlitesample1/databases/LocationDB.dbへのコピーが失敗しているんですね。
    それなら書き込み時のエラーログが出ていると思うので確認してください。

    キャンセル

  • 2017/01/25 10:47

    上記returnを挿入したままの状態でlogcatの内容を出力してみたところ、
    Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
    というログが頻発していました。調べてみたところ、ファイルが存在していない時に発生する例外みたいです。素人考えですが、InputStreamが上手く機能していないのかな、と…
    以下エラー部分の抜粋です。

    01-25 01:13:36.710 E/Hyphenator( 1205): error loading hyphenation /system/usr/hyphen-data/hyph-en-us.pat.txt

    01-25 01:13:36.710 E/Hyphenator( 1205): java.io.FileNotFoundException: /system/usr/hyphen-data/hyph-en-us.pat.txt: open failed: ENOENT (No such file or directory)

    01-25 01:13:36.710 E/Hyphenator( 1205): at libcore.io.IoBridge.open(IoBridge.java:452)

    01-25 01:13:36.710 E/Hyphenator( 1205): at libcore.io.IoUtils$FileReader.<init>(IoUtils.java:207)

    01-25 01:13:36.710 E/Hyphenator( 1205): at libcore.io.IoUtils.readFileAsString(IoUtils.java:114)

    01-25 01:13:36.710 E/Hyphenator( 1205): at android.text.Hyphenator.loadHyphenator(Hyphenator.java:96)

    01-25 01:13:36.710 E/Hyphenator( 1205): at android.text.Hyphenator.init(Hyphenator.java:154)

    01-25 01:13:36.710 E/Hyphenator( 1205): at com.android.internal.os.ZygoteInit.preloadTextResources(ZygoteInit.java:207)

    01-25 01:13:36.710 E/Hyphenator( 1205): at com.android.internal.os.ZygoteInit.preload(ZygoteInit.java:186)

    01-25 01:13:36.710 E/Hyphenator( 1205): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)

    01-25 01:13:36.710 E/Hyphenator( 1205): Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)

    01-25 01:13:36.710 E/Hyphenator( 1205): at libcore.io.Posix.open(Native Method)

    01-25 01:13:36.710 E/Hyphenator( 1205): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)

    01-25 01:13:36.710 E/Hyphenator( 1205): at libcore.io.IoBridge.open(IoBridge.java:438)

    01-25 01:13:36.710 E/Hyphenator( 1205): ... 7 more

    01-25 01:13:36.710 E/Hyphenator( 1205): error loading hyphenation /system/usr/hyphen-data/hyph-eu.pat.txt

    01-25 01:13:36.710 E/Hyphenator( 1205): java.io.FileNotFoundException: /system/usr/hyphen-data/hyph-eu.pat.txt: open failed: ENOENT (No such file or directory)

    キャンセル

  • 2017/01/25 10:51

    関係なさそうです。
    copyDataBaseFromAssetメソッドの最後にログ出力を行いログが出力されるかを確認してください。

    キャンセル

  • 2017/01/26 16:04

    返信遅れました。
    copyDataBaseFromAssetメソッドの最後にログ出力をする為には、copyDataBaseFromAssetメソッドの次にlog.eなどを挿入してlogcatのログを確認すれば良いのでしょうか?

    キャンセル

  • 2017/01/26 16:09

    メソッドの外じゃないですよ。メソッドの中の最後に書いてください。
    mInput.close();の後です。

    キャンセル

  • 2017/01/26 20:41

    コメント頂いた位置にLogを挿入しlogcatでログを取ってみたところ出力されました。open failed: ENOENTが数回と、下記のようなエラーログが発生していました。
    --------- beginning of crash

    01-26 08:38:23.915 E/AndroidRuntime( 1885): FATAL EXCEPTION: main

    01-26 08:38:23.915 E/AndroidRuntime( 1885): Process: com.android.launcher3, PID: 1885

    01-26 08:38:23.915 E/AndroidRuntime( 1885): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.launcher3/com.android.launcher3.Launcher}: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.appwidget.AppWidgetHostView$ParcelableSparseArray instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x4. Make sure other views do not use the same id.

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4077)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.ActivityThread.-wrap15(ActivityThread.java)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1350)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.os.Handler.dispatchMessage(Handler.java:102)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.os.Looper.loop(Looper.java:148)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.ActivityThread.main(ActivityThread.java:5417)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at java.lang.reflect.Method.invoke(Native Method)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): Caused by: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.appwidget.AppWidgetHostView$ParcelableSparseArray instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/0x4. Make sure other views do not use the same id.

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.View.onRestoreInstanceState(View.java:14771)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.widget.TextView.onRestoreInstanceState(TextView.java:4058)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.View.dispatchRestoreInstanceState(View.java:14746)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3127)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.view.View.restoreHierarchyState(View.java:14724)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2035)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.Activity.onRestoreInstanceState(Activity.java:1004)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at com.android.launcher3.Launcher.onRestoreInstanceState(Launcher.java:1950)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.Activity.performRestoreInstanceState(Activity.java:959)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1163)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2389)

    01-26 08:38:23.915 E/AndroidRuntime( 1885): ... 10 more

    キャンセル

  • 2017/01/26 21:33

    なにをやったんですか?
    ログ出力しただけではそんなエラーは発生しません。

    キャンセル

  • 2017/01/26 21:55

    手順としましては、mInput.close(); の直後にlogを挿入した後、コマンドプロンプトからadb logcat -v time > log.txtを入力してログをテキストファイルで出力されるようにした後exlipseのデバッグモードでエミュレータを起動させました。エミュレータの起動後エミュレータを閉じて作成されたテキストファイルからログを転載した形です。

    キャンセル

  • 2017/01/26 22:34

    「logを挿入した」とは、具体的になにを書いたんですか?

    キャンセル

  • 2017/01/26 23:24

    Log.v("it", "debuglog text");
    Log.d("it", "debuglog text");
    Log.i("it", "debuglog text");
    Log.w("it", "debuglog text");
    Log.e("it", "debuglog text");
    と書き込みました

    キャンセル

  • 2017/01/27 01:45

    プロジェクト内でView#setIdとか使っていますか?

    キャンセル

  • 2017/01/27 02:27

    いえ、このプロジェクト内のクラス全てでsetIdは使っていません。

    キャンセル

  • 2017/01/27 10:42

    ログを出力するのは諦めましょう、何かが変です。

    sdb#onCreateのデータベースにアクセスする直前で下記を行なってください。

    ・new File("data/data/com.example.sqlitesample1/databases/LocationDB.db").exist()をToastで表示してください。

    キャンセル

  • 2017/01/27 13:18

    sdb#onCreateの直前にToastの出力をしようとしたところToastが表示されませんでした。
    そこで、sdbに遷移する前のactivityでstartActivity(intent);でsdbに遷移する直前に上記Toastの出力を行ったところ、Trueが返ってきました。

    キャンセル

  • 2017/01/27 14:30

    クラスの上から順番にメソッドが呼ばれると思っていますか?

    キャンセル

  • 2017/01/27 15:14

    確かに考えてみたら、sdb#onCreateだとアクティビティの開始と共に処理が行われるので、それより前に記述しても意味がないことに気づきました、申し訳ありません。
    override以下を下記のように書き直してエミュレータを起動して確認したところ、ToastにTrueが表示されました。
    @Override
    public void onCreate(Bundle savedInstanceState) {
    File file = new File("data/data/com.example.sqlitesample1/databases/LocationDB.db");
    boolean a=file.exists();
    String str1 = String.valueOf( a );
    Toast.makeText(this,str1,Toast.LENGTH_LONG).show();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.showdatabase);
    db = (new MyOpenHelper(this)).getWritableDatabase();
    cigaretteList = (ListView)findViewById(R.id.lvkiso);
    return;
    // Cursor c = db.query("Item",null, null, null, null, null, null);
    // c.moveToFirst();
    // cigaretteList.setAdapter(new SimpleCursorAdapter(this,
    // R.layout.list_item,
    // c,
    // new String[] {"ID", "Name", "Temp"},
    // new int[] {R.id.ID, R.id.Name, R.id.Temp}));
    }

    キャンセル

  • 2017/01/27 15:33 編集

    やっぱり理解していないですね。
    クラス内でメソッドA、メソッドBの順に記載したからと言ってメソッドAが必ずメソッドBよりも先に呼ばれるというわけではありません。

    一度アプリケーションを削除してから実行してください。

    キャンセル

  • 2017/01/27 16:39

    一度アプリケーションを削除してから実行というのはどのようにすればよいのでしょうか?
    アプリケーションが指すものが何かがわからないです…

    キャンセル

  • 2017/01/27 17:01

    横から失礼します。
    heyasumi411さん、推測ですが、
    MyOpenHelperクラスはとあるサイトのサンプルコードを参考に実装したものではないでしょうか?
    そのような場合は、参考にされたサイトのURL等を張っておくことをおすすめします。

    キャンセル

  • 2017/01/27 17:04

    >abs123様
    http://y-anz-m.blogspot.jp/2011/01/android-sqline-database.html
    こちらのDataBaseHelperを元に実装したものです。

    キャンセル

  • 2017/01/27 17:16

    パーミッションは書いていますか?

    キャンセル

  • 2017/01/27 17:22

    android.Manifest.xmlに書き込むものでしたら、android.permission.WRITE_EXTERNAL_STORAGEだけは書き込んでいます。

    キャンセル

  • 2017/01/27 17:49

    Android端末側の設定でパーミッションは与えていますか?

    キャンセル

  • 2017/01/27 18:24

    エミュレータ上で設定からアプリの項目を開き当該アプリの権限を確認したところ、ストレージに対して許可が行われていました。

    キャンセル

  • 2017/01/28 12:50

    パーミッションは大丈夫そうですね。
    とりあえずリード権限も付けておきましょう。

    また、エミュレータからアプリケーションをアンインストールしてから再度アプリを実行してください。

    キャンセル

  • 2017/01/28 13:39

    >リード権限
    すいません、パーミッションの一覧から該当するパーミッションを探してみましたが、どれが当てはまるものかの判別がつきませんでした。READ_INPUT_STATEでしょうか?

    エミュレータを起動した後アプリケーションのアンインストールをした後、コマンドプロンプトを用いて再度アプリケーションをインストールしsdbを始動させたところtrueが返ってきました

    キャンセル

  • 2017/01/28 20:42

    リファレンスを読みましょう、パーミッションはREAD_EXTERNAL_STORAGEです。

    ・データベースにアクセスしているのはsdbだけですか?
    ・copyDataBaseFromAssetの先頭にあるdbExistの値をトーストで出力してください。その後アプリをアンインストールして再度実行してください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Android

    6504questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Eclipse

    1655questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

  • SQLite

    618questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。