0

私はアンドロイドプログラミングが初めてで、統合された SQLite データベースを使用してアプリを作成しようとしていました。

アセット フォルダーから内部メモリに DB をコピーするコードを何度も書き込もうとした後、このSQLiteAssetHelperライブラリに出くわし、それを使用しようとしましたが、空白のアプリ画面が開き、数秒後にクラッシュし、 「(AppName) が停止しました」というメッセージが表示されます。

ルート化されていない Samsung Galaxy S3 という実際のデバイスでアプリをテストしています。

いくつかのコード:

主な活動

package com.example.database2;

import android.os.Bundle;
import android.app.ListActivity;
import android.database.Cursor;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListAdapter;


public class MainActivity extends ListActivity {

private Cursor employees;
private Database db;

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

db = new Database(this);
employees = db.getEmployees(); 

ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1,
employees,
new String[] {"name"},
new int[] {android.R.id.text1},0);

getListView().setAdapter(adapter);
}

@Override
protected void onDestroy() {
super.onDestroy();
employees.close();
db.close();
}


}

SQLite アセット ヘルパー

package com.example.database2;

import android.content.Context;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;

public class Database extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "contacts.db";
    private static final int DATABASE_VERSION = 1;

    public Database(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    }



public Cursor getEmployees() {

SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

String [] sqlSelect = {"_id", "name", "number"};
String sqlTables = "contacts.db";

qb.setTables(sqlTables);
Cursor c = qb.query(db, sqlSelect, null, null,
null, null, null);

c.moveToFirst();
return c;

}



}

マニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.database2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.database2.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

誰かが助けてくれれば幸いです。

編集:

関連する logcat を投稿していますが、あまり情報が得られませんでした。

ログキャット

E/SQLiteDatabase(3658): Failed to open database '/data/data/com.example.database2/databases/contacts'.
E/SQLiteDatabase(3658): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
E/SQLiteDatabase(3658): at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
E/SQLiteDatabase(3658): at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:278)
4

2 に答える 2

0

まあ、問題は単純でばかげていることがわかりました.SQLiteAssetHelperが機能するには、資産/データベースにコピーする必要があることが判明したときに、圧縮されたデータベースを資産フォルダーにコピーしていました.

フォルダを作成してその中にDBを入れた後、すべてがうまくいきました。

于 2013-08-30T17:02:28.163 に答える
-1

クラッシュする理由を LogCat の出力に追加していただけますか?

データベース名はcontacts.dbであり、テーブル名ではありません

正しいテーブル名を設定してください

String sqlTables = "your_table_name";

編集: 私のプロジェクトの 1 つで行ったように、Android で SQLite を使用する方法を簡単に紹介します。

まず、DBHandler クラスを用意します。

 public class DBHandler extends SQLiteOpenHelper {

    // table names
    public static final String TABLE_NAME = "contacts";

    // table column names
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_NUMBER = "number";

    // Database Name
    private static final String DATABASE_NAME = "contacts";
    private static final int DATABASE_VERSION = 1;

    // Statements for creating tables
    private static final String TABLE_CREATE = "CREATE TABLE "
            + TABLE_NAME + " (" + COLUMN_ID
            + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + COLUMN_NAME
            + " VARCHAR(255)," + COLUMN_NUMBER + " VARCHAR(255);";

    public DBHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Create tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(TABLE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(DBHandler.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

次に、クエリやその他のものを処理するクラスが必要です...それを DataSource と呼びましょう:

public class DataSource {

// Database fields
private SQLiteDatabase database;
private DBHandler databaseHelper;
private String[] allColumns = { DBHandler.COLUMN_ID,
        DBHandler.COLUMN_NAME, DBHandler.COLUMN_NUMBER};

public DataSource(Context context) {
    databaseHelper = new DBHandler(context);
        this.open();
}

public void open() throws SQLException {
    database = databaseHelper.getWritableDatabase();
}

public void close() {
    databaseHelper.close();
}

    // here you can place your custom functions 
    public Cursor getEmployees(){
            Cursor cursor = database.query(DBHandler.TABLE_NAME,
            allColumns, null, null, null, null, null);
            cursor.moveToFirst();
            return cursor;
    }
}

MainActivity では、次のことを行います。

public class MainActivity extends ListActivity {

        private Cursor employees;
        private DataSource datasource;
        private SimpleCursorAdapter adapter;

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

        datasource = new DataSource(this);
        employees = datasource.getEmployees(); 

        adapter = new SimpleCursorAdapter(this,
        android.R.layout.simple_list_item_1,
        employees,
        new String[] {"name"},
        new int[] {android.R.id.text1},0);

        this.setListAdapter(adapter);
    }

    @Override
    public void onResume() {
        datasource.open();
        super.onResume();
    }

    @Override
    public void onPause() {
        datasource.close();
        super.onPause();
    }
}

レイアウトは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
    <ListView
        android:id="@android:id/android:list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

ListView の ID が android:list であることが重要です。

この特定のものはテストしませんでしたが、コードをこれに合わせて調整しました。そのように動作するはずです。

于 2013-08-29T19:12:27.700 に答える