Sqlite数据库问题android

Posted

技术标签:

【中文标题】Sqlite数据库问题android【英文标题】:Sqlite database problem android 【发布时间】:2011-09-23 07:42:41 【问题描述】:

我的sqlite数据库有问题。首先我在外部创建数据库,然后将其放入assets文件夹中。以下代码复制数据库。

public class DbH extends SQLiteOpenHelper
    private Context mycontext;

    private String DB_PATH = "/data/data/com.android.quotes/databases/";
    private static String ROW_ID="_id";
    private static String DB_NAME = "mdb1.db";
    public SQLiteDatabase myDataBase;
    /*private String DB_PATH = "/data/data/"
        + mycontext.getApplicationContext().getPackageName()
        + "/databases/";
    */

    public DbH(Context context) throws IOException  
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if(dbexist)
            //System.out.println("Database exists");
            opendatabase(); 
         else 
            System.out.println("Database doesn't exist");
            createdatabase();
        
    

    public void createdatabase() throws IOException
        boolean dbexist = checkdatabase();
        if(dbexist)
            System.out.println(" Database exists.");
         else 
            this.getReadableDatabase();
            try
                copydatabase();
             catch(IOException e)
            throw new Error("Error copying database");
            
        
    

    private boolean checkdatabase() 
        //SQLiteDatabase checkdb = null;
        boolean checkdb = false;
        try
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            SQLiteDatabase.openDatabase
               (myPath,null,SQLiteDatabase.OPEN_READWRITE);
            checkdb = dbfile.exists();
             catch(SQLiteException e)
                System.out.println("Database doesn't exist");
            
            return checkdb;
    

    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 byte to inputfile to 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_READWRITE
        );
    

    public synchronized void close()
        if(myDataBase != null)
            myDataBase.close();
        
        super.close();
    

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

    @Override
    public void onCreate(SQLiteDatabase arg0) 
    // TODO Auto-generated method stub
    


在主要活动中,我首先调用 createdatabase,然后调用 opendatabase。 现在我在sqlite数据库中只创建了两个表,一个是android_metadata,第二个是mTable。当我运行程序时出现以下错误。

    虽然创建了数据库,我可以在 Eclipse 中使用文件资源管理器查看它,但只有 android_metadata 表存在,mTable 不存在。 所以它说从 mTab​​le 中选择 * 时不存在这样的表。

我出错的任何建议。我从一个星期拉我的头发。请帮忙。 提前致谢。

【问题讨论】:

你得到这个问题的解决方案了吗?我得到了完全一样的...... 【参考方案1】:

首先检查数据库数据库是否存在于内部存储中,如果不是副本

private void checkDatabase() 

        StringBuffer dbPath = new StringBuffer();
        File databaseFile;
        // Location of the database file, where it will be stored to access
        // throughout the program.
        dbPath.append("/data/data/");
        dbPath.append(getBaseContext().getPackageName());
        dbPath.append("/databases/");

        // Location of the database file stored in assets folder.
        String storedDatabase = Constants.DATABASE_FILE_NAME;

        // copy the database
        try 

            databaseFile = new File(dbPath.toString(), Constants.DATABASE_FILE_NAME);

            if (databaseFile.exists()) 
                Log.i("database", "database already Exists");

             else 
                SQLiteDatabase database = openOrCreateDatabase(Constants.DATABASE_FILE_NAME,
                        SQLiteDatabase.OPEN_READONLY, null);
                database.close();
                copyDatasbase(getBaseContext().getAssets(), storedDatabase,
                        dbPath + Constants.DATABASE_FILE_NAME);
            
         catch (IOException ioException) 

            ioException.printStackTrace();
         catch (Exception exception) 

            exception.printStackTrace();
        

    

如果数据库不存在,则从资产复制到内部存储

private void copyDatasbase(AssetManager manager, String sourceFileName,
            String destinationFileName) throws IOException 

        // Read file from AccessManager
        InputStream inputStream = manager.open(sourceFileName);
        OutputStream outputStream = new FileOutputStream(destinationFileName);
        Log.d("-->", "src: " + sourceFileName);
        Log.d("-->", "Des: " + destinationFileName);
        byte[] buffer = new byte[3072];
        int length;
        while ((length = inputStream.read(buffer)) > 0) 
            // Write the database file to the folder "databases"
            outputStream.write(buffer, 0, length);

        

        outputStream.flush();
        outputStream.close();
        inputStream.close();

        outputStream = null;
        inputStream = null;
    

【讨论】:

以上是关于Sqlite数据库问题android的主要内容,如果未能解决你的问题,请参考以下文章

Android SQLite“没有这样的表”异常

Android sqlite / BLOB 性能问题

不理解?为啥我们在“Android Sqlite”中需要 BLOB

Android Sqlite:如何从 Listview 中获取 SQLite rowId?

使用 Datagrip 浏览 Android SQLite

Android Sqlite - 无法在 onCreate 之外调用数据库处理程序