无法获取来自SQLite数据库数据 [英] Not able to fetch data from Sqlite Database

查看:388
本文介绍了无法获取来自SQLite数据库数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从SQLite数据库提取数据,并在列表中显示出来。

I want to fetch data from SQLITE database and display it in a LIST.

我的数据库名称是AppDB.db和表名是代息,其中包含3列_id(主键)和符号放; COMPANY_NAME这是文本。

My database name is AppDB.db and table name is Scrip which contains 3 columns _id(primary key) and symbol&company_name which are text.

我想只获取第二和第三列。我在Assets文件夹复制的数据库。

I want to fetch only 2nd and 3rd column. I have copied database in Assets folder.

我得到强制关闭当我执行以下code,但我不知道可能是什么原因。请帮助..

I get force close when I execute following code but I don't know what might be the reason. Please help..

我绝对初学者到Android,所以任何帮助AP preciated ...

内容:

1)DataAttach.java

1.) DataAttach.java

2)DbManager.java

2.) DbManager.java

3)LogCat中

4)在短暂的.xml

4.) .xml in brief

5)AVD问题

6)数据库的快照

1)DataAttach.java

public class DataAttach extends Activity {
    private DbManager dbM;
    private Cursor c;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            dbM = new DbManager(this);
            dbM.createDataBase();
            dbM.openDB();

            try {
                c = dbM.fetchAllData();
            } catch (Exception e) {
                throw new Error("\n\nERROR Fetchin data\n\n");
            }

            if (c != null) {
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                        this,
                        android.R.layout.simple_list_item_1,
                        c,
                        new String[] { c.getString(c.getColumnIndex("_id")),
                                c.getString(c.getColumnIndex("symbol")),
                                c.getString(c.getColumnIndex("company_name")) },
                        new int[] { R.id._id, R.id.symbol, R.id.company_name });
                ListView list = (ListView) findViewById(R.id.MainLayout);
                list.setAdapter(adapter);
            }
        }

        catch (Exception e) {
            throw new Error("\n\nERROR DB failure\n\n");
        }

        finally {
            c.close();
            dbM.close();
        }
    }
}     


2)DbManager.java

public class DbManager extends SQLiteOpenHelper {

    private static final String KEY_ROWID = "_id";
    private static final String KEY_SYMBOL = "symbol";
    private static final String KEY_COMPANY_NAME = "company_name";

    private static final String DATABASE_NAME = "AppDB";
    private static final String DATABASE_PATH = "/data/data/com.dbexample/databases/";
    private static final Integer DATABASE_VERSION = 3;
    private static final String DATABASE_TABLE = "Scrip";
    // private static final String TAG = "DbManager";
    private final Context ctx;
    private SQLiteDatabase mDb;

    public DbManager(Context context) {

        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.ctx = context;
    }

    /*
     * Creates a empty database on the system and rewrites it with your own
     * database.
     */
    public void createDataBase() {

        if (checkDataBase()) {
            // do nothing - database already exist
        } else {
            /*
             * By calling this method and empty database will be created into
             * the default system path of your application so we can overwrite
             * that database with our database.
             */
            this.getReadableDatabase();

            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("\n\nERROR copying database\n\n");
            }
        }
    }

    /*
     * Check if the database already exist to avoid re-copying the file each
     * time you open the application.
     */
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DATABASE_PATH + DATABASE_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);

        } catch (SQLiteException e) {
            throw new Error("\n\nERROR database does't exist yet\n\n");
        }

        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }

    /*
     * Copies your DB from your local assets-folder to the just created empty DB
     * in the system folder, from where it can be accessed and handled.
     */
    private void copyDataBase() throws IOException {
        /* Open your local db as the input stream */
        InputStream myInput = ctx.getAssets().open(DATABASE_NAME);

        /* Path to the just created empty db */
        String outFileName = DATABASE_PATH + DATABASE_NAME;

        /* Open the empty db as the output stream */
        OutputStream myOutput = new FileOutputStream(outFileName);

        /* transfer bytes from the inputfile to the outputfile */
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }

        myOutput.flush();
        myOutput.close();
        myInput.close();
    }

    public void openDB() throws SQLException {
        String myPath = DATABASE_PATH + DATABASE_NAME;
        mDb = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.OPEN_READONLY);
    }

    @Override
    public void close() {
        mDb.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    }

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

    public Cursor fetchAllData() {
        return mDb.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_SYMBOL,
                KEY_COMPANY_NAME }, null, null, null, null, null);

        // return mDb.rawQuery("select _id,symbol,company_name from Scrip",
        // new String[] { KEY_ROWID,KEY_SYMBOL, KEY_COMPANY_NAME });
    }
}                                


3)。LOG CAT

sqlite3_open_v2("/data/data/com.dbexample/databases/AppDB", &handle, 1, NULL) failed

Failed to open the database. closing it.

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file

at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)

at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1017)              


4。)的main.xml

它含有3 TextViews RelativeLayout的内RelativeLayout的。

It contains RelativeLayout having 3 TextViews within RelativeLayout.

5)的我总是得到这个错误

5.) I ALWAYS GET THIS ERROR

即使重开食,重新启动系统,重新创建AVD,努力,kill_server和START_SERVER后,我得到这个消息。

Even after reopening the eclipse, restarting the system, recreating the AVD, trying, kill_server and start_server, I get this message.

Failed to install DataAttach.apk on device 'emulator-5554': device not found
com.android.ddmlib.InstallException: device not found
Launch canceled!            


DB的 6)截图:

全DOC编辑,以最新code和ACC。您的建议,但还是应用程序无法正常工作。

WHOLE DOC EDITED TO LATEST CODE AND ACC. TO YOUR SUGGESTIONS, but still app doesn't work.

推荐答案

我不知道你是想用这个函数来完成。你想读一个.db文件,说数据库被创建。当您尝试运行第一次不会有数据库路径的.db文件。这就是为什么没有这样的文件或目录引发错误。

I don't know what you are trying to do with this function. You're trying to read a .db file and say the DB is created. First time when you try to run there won't be a .db file in the database path. That is why the 'No such File or Directory' error is thrown.

11-25 12:06:13.398: E/Netd(31): Unable to bind netlink socket: No such file or directory

在DBManager构造函数调用SQLiteOpenHelper的getReadableDatabase()如果没有一个这将创建一个数据库。 <一href=\"http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#getReadableDatabase%28%29\"相对=nofollow> SQLiteOpenHelper

In the DBManager Constructor call the SQLiteOpenHelper's getReadableDatabase() which will create a db if there is not one. SQLiteOpenHelper

 public void createNewDatabase() {
                InputStream assetsDB = null;
                try {
                    assetsDB = context.getAssets().open(DATABASE_NAME);
                    OutputStream dbOut = new FileOutputStream(DATABASE_PATH
                            + DATABASE_NAME);

                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = assetsDB.read(buffer)) > 0) {
                        dbOut.write(buffer, 0, length);
                    }

                    dbOut.flush();
                    dbOut.close();
                    assetsDB.close();
                    Log.i(TAG, "New database created...");
                } catch (IOException e) {

                    Log.e(TAG, "Could not create new database...");
                }
            }

这篇关于无法获取来自SQLite数据库数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆