2012-08-06 15 views
0

我创建了一个数据库文件(.db的)使用的SQLiteManager一个表TEstTable/资产文件夹中粘贴它。我想从我的Android应用程序对这个数据库执行操作。这个简单的java代码在Android中访问SQLite数据库有什么问题?

为了做到这一点我也跟着this tutorial堆栈溢出的建议。

更增添了几分代码读取它并将结果保存在一个字符串,并打印导致,要精确,我只加了rawquery。

检查我的代码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的;

+0

你检查你的数据库中包含?显然它是空的,或者它不包含'TestTable',或者你在这里或者当你创建数据库时错误地输入了'TestTable'。使用一些工具来检查。 – 2012-08-06 07:58:20

+0

yes它包含TestTable,我在SQLite管理器中执行了与rawquery中使用的查询相同的查询,并且它完美地返回了数据。 – 2012-08-06 08:14:40

+0

哪条线发生异常? – 2012-08-06 07:30:26

回答

0

检查你的数据库,如果表TestTable的存在,beacaus错误s数导致选择在getEntries从您的活动称为方法声明。你从日志中发布的错误表明,没有这样的表存在。

+0

我在SQLite管理器中运行了相同的查询,它正在返回数据。 – 2012-08-06 08:07:48

0

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

private static final String DB_NAME = "managerSample"; 

编辑

This may help you

+0

已经检查过。 – 2012-08-06 09:24:33

+0

http://sdrv.ms/N857Wn http://stackoverflow.com/questions/9109438/how-to-use-existing-database-with-android-app/9109728#9109728 – 2012-08-06 09:28:32

相关问题