简体   繁体   English

在设备上运行时没有这样的表错误,但在模拟器上相同的代码工作正常

[英]No such table error when running on device but on emulator same code works fine

I have a very weird problem I am writing a code that gets data from database to show it in listView, so I've made a class for getting the database and other one for the adapter. 我有一个非常奇怪的问题我正在编写一个从数据库中获取数据的代码,以便在listView中显示它,所以我创建了一个用于获取数据库的类和用于适配器的其他类。 But when I run it on device I got no such table error, although it's working fine on emulator. 但是当我在设备上运行它时,我没有遇到这样的表错误,尽管它在模拟器上工作正常。 Also, I tried this code with another database in the same project and it's working. 此外,我尝试使用同一个项目中的另一个数据库的这个代码,它正在工作。 I added the android_metadata table to them, but still not working. 我向他们添加了android_metadata表,但仍然没有工作。

This is my db class 这是我的db class

public class Directory_DB extends SQLiteOpenHelper{

private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
//destination path (location) of our database on device
private static String DB_PATH = ""; 
private static String DB_NAME ;// Database name
private SQLiteDatabase mDataBase; 
private final Context mContext;
private String TABLE_NAME;

public Directory_DB(Context context , String DB_NAME ) 
{
    super(context , DB_NAME, null , 2);// 1? its Database Version
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    this.mContext = context;
    this.DB_NAME = DB_NAME;

}   

public void createDataBase() throws IOException
{
    //If database not exists copy it from the assets

    boolean mDataBaseExist = checkDataBase();
    if(!mDataBaseExist)
    {
        this.getReadableDatabase();
        this.close();
        try 
        {
            //Copy the database from assests
            copyDataBase();
            Log.e(TAG, "createDatabase database created");
        } 
        catch (IOException mIOException) 
        {
            throw new Error("ErrorCopyingDataBase");
        }
    }
}
    //Check that the database exists here: /data/data/your package/databases/Da Name
    private boolean checkDataBase()
    {
        File dbFile = new File(DB_PATH + DB_NAME);
        Log.v("dbFile", dbFile + "   "+ dbFile.exists());
        return dbFile.exists();
    }

    //Copy the database from assets
    private void copyDataBase() throws IOException
    {
        InputStream mInput = mContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream mOutput = new FileOutputStream(outFileName);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer))>0)
        {
            mOutput.write(mBuffer, 0, mLength);
        }
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    //Open the database, so we can query it
    public boolean openDataBase() throws SQLException
    {
        String mPath = DB_PATH + DB_NAME;
        //Log.v("mPath", mPath);
        mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        return mDataBase != null;
    }

    @Override
    public synchronized void close() 
    {
        if(mDataBase != null)
            mDataBase.close();
        super.close();
    }




@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

}

} }

and this is my adapter class 这是我的adapter class

public class DirectoryAdapter {
public static final String TAG_ID = "_id";
public static String TAG_TABLE_NAME;

protected static final String TAG = "DataAdapter";

private final Context mContext;
private SQLiteDatabase mDb;
private Directory_DB mDbHelper;

public DirectoryAdapter(Context context, String DB_NAME, String TABLE_NAME) {
    this.mContext = context;
    mDbHelper = new Directory_DB(mContext, DB_NAME );
    this.TAG_TABLE_NAME = TABLE_NAME;
    Log.d("Database name in adapter", DB_NAME);
    Log.d("Table name in adapter", TAG_TABLE_NAME);
}

public DirectoryAdapter createDatabase() throws SQLException {
    try {
        mDbHelper.createDataBase();
    } catch (IOException mIOException) {
        Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
        throw new Error("UnableToCreateDatabase");
    }
    return this;
}

public DirectoryAdapter open() throws SQLException {
    try {
        mDbHelper.openDataBase();
        mDbHelper.close();
        mDb = mDbHelper.getReadableDatabase();
    } catch (SQLException mSQLException) {
        Log.e(TAG, "open >>" + mSQLException.toString());
        throw mSQLException;
    }
    return this;
}

public void close() {
    mDbHelper.close();
}

public Cursor getTestData() {
    try {

        String sql = "SELECT * FROM " + TAG_TABLE_NAME;
        Cursor mCur = mDb.rawQuery(sql, null);

        return mCur;
    } catch (SQLException mSQLException) {
        Log.e(TAG, "getTestData >>" + mSQLException.toString());
        throw mSQLException;
    }
}

} }

您可以从设备中卸载应用程序并再次运行它。如果您稍后在数据库中添加了表,则不会反映它,因为您的数据库已经创建,并且仅在创建数据库时才创建表。

You have to call your createDataBase method inside the on create method 您必须在on create方法中调用createDataBase方法

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

that's what's this method is for. 这就是这种方法的用途。 Also if you're calling it form any where else (I didn't read your whole code) don't. 此外,如果你在任何其他地方(我没有阅读你的整个代码)调用它,请不要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 数据库在模拟器中工作正常,但在设备上出错 - Database works fine in emulator, but gives an error on device Firebase function 在模拟器中工作正常,但在实际设备上使用时会引发“超出期限”错误。 有人面临同样的问题吗? - Firebase function works fine in emulator but throws “deadline exceeded” error when using from an actual device. Anybody facing the same issue? 应用程序在模拟器上运行正常,但在我的设备上运行时无法登录/注册 - app works perfectly fine on the emulator but when running on my device it doesn't login/register Device Admin API示例:在设备上的模拟器NoSuchMethod错误上可以正常工作 - Device Admin API sample: works fine on emulator NoSuchMethod error on Device android应用程序在模拟器上工作正常,但在实际设备上崩溃,并在android studio中出现以下错误,并附加了代码 - android app works fine on emulator but crashes on real device with following error in android studio the code is attached 相同的代码适用于物理设备,但不适用于Android 4仿真器 - Same code works on phisical device but not in the Android 4 emulator Webview在模拟器上工作正常,但在设备上工作不正常 - Webview works fine on emulator but not on device Android设备上的SQLite异常:没有这样的表,但是模拟器可以正常工作吗? - SQLite exception on Android Device : No such table, but emulator works fine? Android 应用程序在模拟器上运行良好,但在真实设备上运行时会出现错误解析包 - Android app running fine on emulator but gives error parsing package when made to run on real device 检测设备是否已植根或无法在设备上正常运行,但不能在模拟器上运行 - Detecting device is rooted or not works fine on device but not on emulator
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM