【问题标题】:What is wrong with this simple java code to access SQLite database in Android?这个在 Android 中访问 SQLite 数据库的简单 Java 代码有什么问题?
【发布时间】:2012-08-06 17:19:14
【问题描述】:

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

为了做到这一点,我按照 Stack Overflow 上的建议关注了this tutorial

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

检查我的 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.

}

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: no such table: TestTable: , while compile: SELECT * FROM TestTable ;

【问题讨论】:

  • 哪一行出现异常?
  • 您检查过您的数据库包含的内容吗?显然它是空的,或者它不包含TestTable,或者您在这里输入错误TestTable,或者当您创建数据库时。使用一些工具来检查。
  • 是的,它包含 TestTable,我在 SQLite 管理器中执行了我在 rawquery 中使用的相同查询,它完美地返回了数据。

标签: android sqlite cursor sqlitemanager


【解决方案1】:

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

【讨论】:

  • 我在 SQLite Manager 中运行了相同的查询,它返回了 apt 数据。
【解决方案2】:

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

private static final String DB_NAME = "managerSample"; 

编辑

This may help you.

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多