得到错误在Android的SQLite数据库错误、数据库、Android、SQLite

2023-09-07 03:06:43 作者:落羽

  10月9日至三日:53:15.349:E / SQLiteLog(25173):(14)在30191行无法打开文件[00bb9c9ce4]10月9日至3日:53:15.349:E / SQLiteLog(25173):(14)os_unix.c:30191:(2)开(/data/data/uk.org.nt.android.app1/databases/ntdb) - 10月9日至3日:53:15.359:E / SQLiteDatabase(25173):无法打开数据库'/data/data/uk.org.nt.android.app1/databases/ntdb。10月9日至3日:53:15.359:E / SQLiteDatabase(25173):android.database.sqlite.SQLiteCantOpenDatabaseException:未知错误(code 14):无法打开数据库10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteConnection.nativeOpen(本机方法)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804​​)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在uk.org.nt.android.dynamic.dao.HandbookDBHelper.getAttractionsFromDB(HandbookDBHelper.java:152)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在uk.org.nt.android.dynamic.dao.HandbookDBHelper.findAttractionsForDeletion(HandbookDBHelper.java:96)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在uk.org.nt.android.service.UpdateService.performDeletions(UpdateService.java:270)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在uk.org.nt.android.service.UpdateService.handleHtt presponse(UpdateService.java:138)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在uk.org.nt.android.dynamic.http.HTTPSHelper.onPostExecute(HTTPSHelper.java:91)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在uk.org.nt.android.dynamic.http.HTTPSHelper.onPostExecute(HTTPSHelper.java:1)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.os.AsyncTask.finish(AsyncTask.java:631)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.os.AsyncTask.access $ 600(AsyncTask.java:177)10月9日至3日:53:15.359:E / SQLiteDatabase(25173):在android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:644) 

 公共类HandbookDBHelper扩展SQLiteOpenHelper {    公共静态最终诠释REALM = 1; //手册    私有静态最后弦乐LOG_TAG =HandbookDBHelper;    //为您的应用程序的数据库文件名 - 变化的东西    //适合您的应用    //私有静态最后弦乐DATABASE_NAME =NTDB;    //您更改数据库对象的任何时候,你可能要    //增加数据库版本    私有静态最终诠释DATABASE_VERSION = 1;    文件DBFILE = NULL;    私人静态字符串DATABASE_NAME =NTDB;    上下文语境;    静态的SimpleDateFormat pricesFormatter =新的SimpleDateFormat(YYYY-MM-DD);    静态最后长EPOCH_DIFF = 978307200;    公共HandbookDBHelper(上下文的背景下){        超级(上下文,DATABASE_NAME,空,1); //设置数据库版本        this.context =背景;        字符串fullDBName = context.getDatabasePath(DATABASE_NAME)                .getAbsolutePath();        DBFILE =新的文件(fullDBName);    }    公共无效unpackDatabase()抛出IOException        的OutputStream databaseOutputStream =新的FileOutputStream(DBFILE);        InputStream的databaseInputStream;        字节[]缓冲区=新的字节[1024];        INT partSuffix = 0;        INT DBID;        字符串dbPart preFIX =partdb;        长bytesWritten = 0;        而((DBID = context.getResources()则getIdentifier(                dbPart preFIX + partSuffix,原始,context.getPackageName()))!= 0){            databaseInputStream = context.getResources()openRawResource(DBID)。            而((databaseInputStream.read(缓冲液))大于0){                databaseOutputStream.write(缓冲液);                bytesWritten + = 1024;            }            databaseInputStream.close();            partSuffix ++;        }        databaseOutputStream.flush();        databaseOutputStream.close();    }    / **     *其中的吸引力存在在数据库上,但在不存在     *进来的名单。     *     * /    公共地图<弦乐,HandbookAttraction> findAttractionsForDeletion(            HandbookAttractions handbookAttractions){        地图<弦乐,HandbookAttraction> attractionsMap = getAttractionsFromDB();        对于(HandbookAttraction handbookAttraction:handbookAttractions                .getHandbookAttractionsList()){            如果(attractionsMap.get(handbookAttraction.getUUID())!= NULL){                attractionsMap.remove(handbookAttraction.getUUID());            }        }        返回attractionsMap;    }    / **     *     * @参数attractionsList     * @返回     * /    公共地图<弦乐,HandbookAttraction> findAttractionsForUpdate(            HandbookAttractions handbookAttractions){        地图<弦乐,HandbookAttraction> attractionsMap = getAttractionsFromDB();        //比较版本        Log.d(LOG_TAG,比较版本);        对于(HandbookAttraction handbookAttraction:handbookAttractions                .getHandbookAttractionsList()){            HandbookAttraction dbAttraction = attractionsMap                    获得(handbookAttraction.getUUID());            如果(dbAttraction == NULL){                Log.d(LOG_TAG,NEW+ handbookAttraction.getName());            }否则如果(dbAttraction.getVersion()< handbookAttraction                    .getVersion()){                Log.d(LOG_TAG,UPDATE:+ handbookAttraction.getName()                        +由+ dbAttraction.getVersion()+到                        + handbookAttraction.getVersion());            }其他{                Log.d(LOG_TAG,不改变:+ handbookAttraction.getName()                        +是+ dbAttraction.getVersion()+现在                        + handbookAttraction.getVersion());                attractionsMap.remove(dbAttraction.getUUID());            }        }        Log.d(LOG_TAG,添加或更改总数                + attractionsMap.size());        // attractionsMap现在包含需要更新或增加景点。        返回attractionsMap;    }    / **     *可从DB景点名单,并通过键控地图归还     * UUID     *     * @返回     * /    公共地图<弦乐,HandbookAttraction> getAttractionsFromDB(){        SQLiteDatabase attractionsDB = SQLiteDatabase.openDatabase(                dbFile.getAbsolutePath(),空,SQLiteDatabase.OPEN_READONLY);        地图<弦乐,HandbookAttraction> attractionsMap =新的Hashtable<弦乐,HandbookAttraction>();        光标光标= attractionsDB.rawQuery(                选择_id,ZVERSION,ZUUID从ZATTRACTION,NULL);        INT CPOS = 0;        cursor.moveToFirst();        而(CPOS&L​​T; cursor.getCount()){            HandbookAttraction吸引力=新HandbookAttraction();            attraction.setDbId(cursor.getInt(光标                    .getColumnIndexOrThrow(_ ID)));            attraction.setVersion(cursor.getInt(光标                    .getColumnIndexOrThrow(ZVERSION)));            attraction.setUUID(cursor.getString(光标                    .getColumnIndexOrThrow(ZUUID)));            attractionsMap.put(                    cursor.getString(cursor.getColumnIndexOrThrow(ZUUID)),                    吸引);            CPOS ++;            cursor.moveToPosition(CPOS);        }        cursor.close();        attractionsDB.close();        Log.d(LOG_TAG,装+ attractionsMap.size()                +从数据库景点);        返回attractionsMap;    }    公共无效showDb(){    }    @覆盖    公共无效的onCreate(SQLiteDatabase DB){        // TODO自动生成方法存根    }    @覆盖    公共无效onUpgrade(SQLiteDatabase分贝,INT oldVersion,诠释静态网页){        // TODO自动生成方法存根    }    / **     *执行更新/除了给定的吸引力     *     * @参数handbookAttractionDetail     * /    公共无效updateAttraction(            HandbookAttractionDetail handbookAttractionDetail){        SQLiteDatabase attractionsDB = SQLiteDatabase.openDatabase(                dbFile.getAbsolutePath(),空,SQLiteDatabase.OPEN_READWRITE);        INT attractionRowId = clearDownAttraction(handbookAttractionDetail,                attractionsDB);        布尔isNewAttraction =(attractionRowId == -1);        //        //现在重新构建        //        rebuildAttraction(handbookAttractionDetail,isNewAttraction);        attractionsDB.close();    } 

解决方案 怎样查看 android sqlite数据库

在特定的,有将要访问给定文件路径的数据库中的openDatabase()命令。

  SQLiteDatabase DB = SQLiteDatabase.openDatabase(路径,NULL,0); 

只要指定的路径到你的数据库的路径变量,它应该工作。

09-03 10:53:15.349: E/SQLiteLog(25173): (14) cannot open file at line 30191 of [00bb9c9ce4]
09-03 10:53:15.349: E/SQLiteLog(25173): (14) os_unix.c:30191: (2) open(/data/data/uk.org.nt.android.app1/databases/ntdb) - 
09-03 10:53:15.359: E/SQLiteDatabase(25173): Failed to open database '/data/data/uk.org.nt.android.app1/databases/ntdb'.
09-03 10:53:15.359: E/SQLiteDatabase(25173): android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:209)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:669)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at uk.org.nt.android.dynamic.dao.HandbookDBHelper.getAttractionsFromDB(HandbookDBHelper.java:152)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at uk.org.nt.android.dynamic.dao.HandbookDBHelper.findAttractionsForDeletion(HandbookDBHelper.java:96)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at uk.org.nt.android.service.UpdateService.performDeletions(UpdateService.java:270)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at uk.org.nt.android.service.UpdateService.handleHttpResponse(UpdateService.java:138)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at uk.org.nt.android.dynamic.http.HTTPSHelper.onPostExecute(HTTPSHelper.java:91)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at uk.org.nt.android.dynamic.http.HTTPSHelper.onPostExecute(HTTPSHelper.java:1)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.os.AsyncTask.finish(AsyncTask.java:631)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-03 10:53:15.359: E/SQLiteDatabase(25173):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)

public class HandbookDBHelper extends SQLiteOpenHelper {
    public static final int REALM = 1; // handbook
    private static final String LOG_TAG = "HandbookDBHelper";
    // name of the database file for your application -- change to something
    // appropriate for your app
    // private static final String DATABASE_NAME = "ntdb";
    // any time you make changes to your database objects, you may have to
    // increase the database version
    private static final int DATABASE_VERSION = 1;

    File dbFile = null;

    private static String DATABASE_NAME = "ntdb";

    Context context;

    static SimpleDateFormat pricesFormatter = new SimpleDateFormat("yyyy-MM-dd");

    static final long EPOCH_DIFF = 978307200;

    public HandbookDBHelper(Context context) {
        super(context, DATABASE_NAME, null, 1); // set db version

        this.context = context;

        String fullDBName = context.getDatabasePath(DATABASE_NAME)
                .getAbsolutePath();
        dbFile = new File(fullDBName);
    }

    public void unpackDatabase() throws IOException {

        OutputStream databaseOutputStream = new FileOutputStream(dbFile);
        InputStream databaseInputStream;

        byte[] buffer = new byte[1024];
        int partSuffix = 0;
        int dbId;
        String dbPartPrefix = "partdb";
        long bytesWritten = 0;
        while ((dbId = context.getResources().getIdentifier(
                dbPartPrefix + partSuffix, "raw", context.getPackageName())) != 0) {
            databaseInputStream = context.getResources().openRawResource(dbId);

            while ((databaseInputStream.read(buffer)) > 0) {
                databaseOutputStream.write(buffer);
                bytesWritten += 1024;
            }
            databaseInputStream.close();
            partSuffix++;
        }
        databaseOutputStream.flush();
        databaseOutputStream.close();

    }

    /**
     * where an attraction exists on the database but does not exist in the
     * incomming list.
     * 
     */
    public Map<String, HandbookAttraction> findAttractionsForDeletion(
            HandbookAttractions handbookAttractions) {
        Map<String, HandbookAttraction> attractionsMap = getAttractionsFromDB();

        for (HandbookAttraction handbookAttraction : handbookAttractions
                .getHandbookAttractionsList()) {
            if (attractionsMap.get(handbookAttraction.getUUID()) != null) {
                attractionsMap.remove(handbookAttraction.getUUID());
            }
        }
        return attractionsMap;
    }

    /**
     * 
     * @param attractionsList
     * @return
     */
    public Map<String, HandbookAttraction> findAttractionsForUpdate(
            HandbookAttractions handbookAttractions) {

        Map<String, HandbookAttraction> attractionsMap = getAttractionsFromDB();

        // compare versions
        Log.d(LOG_TAG, "comparing versions");
        for (HandbookAttraction handbookAttraction : handbookAttractions
                .getHandbookAttractionsList()) {
            HandbookAttraction dbAttraction = attractionsMap
                    .get(handbookAttraction.getUUID());
            if (dbAttraction == null) {
                Log.d(LOG_TAG, "NEW: " + handbookAttraction.getName());
            } else if (dbAttraction.getVersion() < handbookAttraction
                    .getVersion()) {
                Log.d(LOG_TAG, "UPDATE: " + handbookAttraction.getName()
                        + " from " + dbAttraction.getVersion() + " to "
                        + handbookAttraction.getVersion());
            } else {
                Log.d(LOG_TAG, "NO CHANGE: " + handbookAttraction.getName()
                        + " was " + dbAttraction.getVersion() + " now "
                        + handbookAttraction.getVersion());

                attractionsMap.remove(dbAttraction.getUUID());
            }
        }
        Log.d(LOG_TAG, "total number of additions or changes :"
                + attractionsMap.size());
        // attractionsMap now contains attractions requiring update or addition.

        return attractionsMap;
    }

    /**
     * get the list of attractions from the DB and return them in a map keyed by
     * UUID
     * 
     * @return
     */
    public Map<String, HandbookAttraction> getAttractionsFromDB() {
        SQLiteDatabase attractionsDB = SQLiteDatabase.openDatabase(
                dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);

        Map<String, HandbookAttraction> attractionsMap = new Hashtable<String, HandbookAttraction>();

        Cursor cursor = attractionsDB.rawQuery(
                "select _id, ZVERSION, ZUUID from ZATTRACTION", null);
        int cpos = 0;
        cursor.moveToFirst();
        while (cpos < cursor.getCount()) {
            HandbookAttraction attraction = new HandbookAttraction();
            attraction.setDbId(cursor.getInt(cursor
                    .getColumnIndexOrThrow("_id")));
            attraction.setVersion(cursor.getInt(cursor
                    .getColumnIndexOrThrow("ZVERSION")));
            attraction.setUUID(cursor.getString(cursor
                    .getColumnIndexOrThrow("ZUUID")));

            attractionsMap.put(
                    cursor.getString(cursor.getColumnIndexOrThrow("ZUUID")),
                    attraction);
            cpos++;
            cursor.moveToPosition(cpos);

        }
        cursor.close();

        attractionsDB.close();
        Log.d(LOG_TAG, "loaded " + attractionsMap.size()
                + " attractions from db");

        return attractionsMap;
    }

    public void showDb() {

    }

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

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

    /**
     * perform update / addition for given attraction
     * 
     * @param handbookAttractionDetail
     */
    public void updateAttraction(
            HandbookAttractionDetail handbookAttractionDetail) {
        SQLiteDatabase attractionsDB = SQLiteDatabase.openDatabase(
                dbFile.getAbsolutePath(), null, SQLiteDatabase.OPEN_READWRITE);

        int attractionRowId = clearDownAttraction(handbookAttractionDetail,
                attractionsDB);
        boolean isNewAttraction = (attractionRowId == -1);
        //
        // now re-build
        //
        rebuildAttraction(handbookAttractionDetail, isNewAttraction);
        attractionsDB.close();
    }

解决方案

In particular, there's an openDatabase() command that will access a database given a file path.

SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, 0);

Just specify the path to your database as the path variable, and it should work.