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

时间:2012-12-19 09:32:48

标签: android sqlite

我有一个非常奇怪的问题我正在编写一个从数据库中获取数据的代码,以便在listView中显示它,所以我已经创建了一个用于获取数据库的类和用于适配器的其他类。 但是当我在设备上运行时,我没有遇到这样的表错误,尽管它在模拟器上工作正常。此外,我尝试将此代码与同一项目中的另一个数据库一起使用。我向他们添加了android_metadata表,但仍然没有工作。

这是我的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

}

}

这是我的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;
    }
}

}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您必须在on create method

中调用createDataBase方法
 @Override
 public void onCreate(SQLiteDatabase db) {
     // TODO Auto-generated method stub
 }

这就是这种方法的用途。 此外,如果您在其他地方(我没有阅读您的整个代码)进行调用,请不要。