0

我使用 SQLiteManager 创建了一个包含一个表的数据库文件 (.db),TEstTable并将其粘贴到/assets文件夹中。我想从我的 Android 应用程序对此数据库执行操作。

为此,我按照Stack Overflow 上的建议遵循了本教程。

添加了更多代码来读取它并将结果保存在字符串中并打印该结果,准确地说我只添加了一个原始查询。

检查我的 DatabaseHelper 类代码:

public class DatabaseHelper extends SQLiteOpenHelper {
    //The Android's default system path of your application database.
    private static final String DB_PATH = "/data/data/com.example.sqlitemanagerexample/databases/";

    private static final String DB_NAME = "managerSample";

    private SQLiteDatabase myDataBase;

    private final Context myContext;

    /**
     * Constructor Takes and keeps a reference of the passed context in order to
     * access to the application assets and resources.
     * 
     * @param context
     */
    public DatabaseHelper(Context context) {

            super(context, DB_NAME, null, 1);
            this.myContext = context;
    }

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

            boolean dbExist = checkDataBase();

            if (dbExist) {
                    // 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 are gonna be able to overwrite that
                    // database with our database.
                    this.getReadableDatabase();

                    try {

                            copyDataBase();

                    } catch (IOException e) {

                            throw new Error("Error copying database");

                    }
            }

    }

    /**
     * Check if the database already exist to avoid re-copying the file each
     * time you open the application.
     * 
     * @return true if it exists, false if it doesn't
     */
    private boolean checkDataBase() {

            SQLiteDatabase checkDB = null;

            try {
                    String myPath = DB_PATH + DB_NAME;
                    checkDB = SQLiteDatabase.openDatabase(myPath, null,
                                    SQLiteDatabase.OPEN_READONLY);

            } catch (SQLiteException e) {

                    /* database does't exist yet. */

            }

            if (checkDB != null) {

                    checkDB.close();

            }

            return checkDB != null ? true : false;
    }

    /**
     * Copies your database from your local assets-folder to the just created
     * empty database in the system folder, from where it can be accessed and
     * handled. This is done by transfering bytestream.
     * */
    private void copyDataBase() throws IOException {

            // Open your local db as the input stream
            InputStream myInput = myContext.getAssets().open(DB_NAME);

            // Path to the just created empty db
            String outFileName = DB_PATH + DB_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);
            }

            // Close the streams
            myOutput.flush();
            myOutput.close();
            myInput.close();

    }

    public void openDataBase() throws SQLException {

            // Open the database
            String myPath = DB_PATH + DB_NAME;
            myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                            SQLiteDatabase.OPEN_READONLY);

    }

    @Override
    public synchronized void close() {

            if (myDataBase != null)
                    myDataBase.close();

            super.close();

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

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

    }

    public String getEntries() {

            Cursor c = myDataBase.rawQuery("SELECT * FROM TestTable ;", null);
            String result = "";
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
                    result = result + c.getShort(0) + c.getString(1) + c.getString(2);

            }
            return result;

    }

    // Add your public helper methods to access and get content from the
    // database.
    // You could return cursors by doing "return myDataBase.query(....)" so it'd
    // be easy
    // to you to create adapters for your views.

}

查看活动的代码:

public class View extends Activity {

    TextView tv;

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.viewdb);
            tv = (TextView) findViewById(R.id.textView1);

            DatabaseHelper myDbHelper ;
            myDbHelper = new DatabaseHelper(this);

            try {

                    myDbHelper.createDataBase();

            } catch (IOException ioe) {

                    throw new Error("Unable to create database");

            }

            try {

                    myDbHelper.openDataBase();

            } catch (SQLException sqle) {

                    throw sqle;

            }



            tv.setText(myDbHelper.getEntries());

    }
}

当我运行此代码时,视图活动未启动并且应用程序被强制关闭。Logcat 说:

E / AndroidRuntime(1764):java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.sqlitemanagerexample/com.example.sqlitemanagerexample.View}:android.database.sqlite.SQLiteException:没有这样的表:TestTable:,而编译: SELECT * FROM TestTable ;
android.database.sqlite.SQLiteException:没有这样的表:TestTable:,编译时:SELECT * FROM TestTable;

4

2 回答 2

0

检查您的数据库,如果 Table TestTable存在,因为从您的活动调用的getEntries方法中的select语句引起的错误。您从日志中发布的错误表明,不存在这样的表。

于 2012-08-06T07:58:35.487 回答
0

检查数据库的名称(存在于 assests 文件夹中),它必须是“ managerSample ”,因为您的代码中有这一行:

private static final String DB_NAME = "managerSample"; 

编辑

这可能对您有所帮助

于 2012-08-06T09:19:14.567 回答