这个简单的java代码在Android中访问SQLite数据库有什么问题?

时间:2012-08-06 07:26:03

标签: android sqlite cursor sqlitemanager

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

为了做到这一点,我遵循Stack Overflow上的建议this tutorial

添加了一些代码来读取它并将结果保存在字符串中并打印出结果,准确地说我只添加了一个rawquery。

检查我的CodeHelper类代码:

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.

}

View Activity的代码:

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;

2 个答案:

答案 0 :(得分:0)

检查您的数据库,如果表 TestTable 存在,请记录由您的活动调用的 getEntries 方法中的选择语句导致的错误。您从日志中发布的错误表明不存在此类表。

答案 1 :(得分:0)

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

private static final String DB_NAME = "managerSample"; 

修改

This may help you