Android 尝试获取SQLite数据时的StringIndexOutOfBoundsException

Android 尝试获取SQLite数据时的StringIndexOutOfBoundsException,android,sqlite,android-sqlite,indexoutofboundsexception,Android,Sqlite,Android Sqlite,Indexoutofboundsexception,当我尝试在活动中使用从数据库SQLite获取数据时 DataBaseAdapterCars mDbHelper = new DataBaseAdapterCars(this); mDbHelper.createDatabase(); mDbHelper.open(); Car[] carsList= mDbHelper.getDataDBCarsArray(uso, eta, category, class); 我得到这个错误

当我尝试在活动中使用从数据库SQLite获取数据时

DataBaseAdapterCars mDbHelper = new DataBaseAdapterCars(this);
        mDbHelper.createDatabase();
        mDbHelper.open();

        Car[] carsList= mDbHelper.getDataDBCarsArray(uso, eta,
        category, class);
我得到这个错误

12-10 17:14:47.069: E/AndroidRuntime(17936): FATAL EXCEPTION: main
12-10 17:14:47.069: E/AndroidRuntime(17936): java.lang.StringIndexOutOfBoundsException
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.app.ContextImpl.validateFilePath(ContextImpl.java:1649)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:555)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at com.my.app.db.DataBaseHelper.createDataBase(DataBaseHelper.java:36)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at com.my.app.db.DataBaseAdapterCars.createDatabase(DataBaseAdapterCars.java:42)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at com.my.app.Cars.initializeData(Cars.java:111)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at com.my.app.Cars$MyAsync$1.run(Cars.java:156)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.os.Handler.handleCallback(Handler.java:587)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.os.Looper.loop(Looper.java:130)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at android.app.ActivityThread.main(ActivityThread.java:3687)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at java.lang.reflect.Method.invokeNative(Native Method)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at java.lang.reflect.Method.invoke(Method.java:507)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
12-10 17:14:47.069: E/AndroidRuntime(17936):    at dalvik.system.NativeStart.main(Native Method)
我的DataBaseAdapterCars类是


例外情况来自您实例化
DataBaseHelper
类的方式,最准确地说,在其构造函数中,您可以执行以下操作:

//...
private static String DB_NAME = "";// Database name
    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DataBaseHelper(Context context, String nomeDB) {
        super(context, DB_NAME, null, 1);// 1? its Database Version
        DB_NAME = nomeDB;
//...
正如您在调用超级构造函数时看到的,您传递了
DB_NAME
,此时它是一个空的
字符串。在某个时候,您可以调用
DataBaseHelper
类的
createDatabase()
数据库,您可以在该类中调用:
this.getReadableDatabase()。这将触发有关数据库的一些初始化,该初始化将因异常而失败,因为您传递了一个空字符串作为数据库名称


即便如此,使用
SQliteOpenHelper
并从资产中复制数据库,代码还是有点凌乱。如果你计划将数据库与你的应用程序捆绑(在资产中),那么也许你会考虑哪些会使你的生活变得更容易。

< P>例外的是来自你实例化<代码>数据库助手> /Cuff>类的方法,最确切地说,在它的构造函数中,你这样做:

//...
private static String DB_NAME = "";// Database name
    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DataBaseHelper(Context context, String nomeDB) {
        super(context, DB_NAME, null, 1);// 1? its Database Version
        DB_NAME = nomeDB;
//...
正如您在调用超级构造函数时看到的,您传递了
DB_NAME
,此时它是一个空的
字符串。在某个时候,您可以调用
DataBaseHelper
类的
createDatabase()
数据库,您可以在该类中调用:
this.getReadableDatabase()。这将触发有关数据库的一些初始化,该初始化将因异常而失败,因为您传递了一个空字符串作为数据库名称


即便如此,使用
SQliteOpenHelper
并从资产中复制数据库,代码还是有点凌乱。如果你计划将数据库绑定到你的应用程序(在资产中),那么也许你会考虑哪一个会让你的生活更容易。

仔细检查你的代码,在这行<代码> MbDeHelp=新的数据库助手(MulnValue,CurrurdDbNeX);
currentDBName
未初始化,您最终会传递
null
。但存在currentDBName=“CarInfo”,因此应在mDbHelper=new DataBaseHelper(mContext,currentDBName)中传递“CarInfo”;我也尝试过mDbHelper=newdatabasehelper(mContext,“CarInfo”);对不起,我的错。我已经发布了一个与您的问题相关的答案。请仔细检查您的代码,在这一行
mDbHelper=newdatabasehelper(mContext,currentDBName)
currentDBName
未初始化,您最终会传递
null
。但存在currentDBName=“CarInfo”,因此应在mDbHelper=new DataBaseHelper(mContext,currentDBName)中传递“CarInfo”;我也尝试过mDbHelper=newdatabasehelper(mContext,“CarInfo”);对不起,我的错。我已经发布了一个关于你问题的答案。谢谢你的回答。。。问题似乎是这样的。有没有一种方法可以在没有外部库的情况下将传递的db名称分配给super(context,db_Name,null,1)中的db_名称?我在assets文件夹中有大约100个不同的数据库,使用100个不同的DBHelper类来解决这个问题真是太糟糕了。@andref如果你可以通过
super(context,nomeDb,null,1)
,我想
nomeDb
是数据库名,对吗?谢谢你的回答。。。问题似乎是这样的。有没有一种方法可以在没有外部库的情况下将传递的db名称分配给super(context,db_Name,null,1)中的db_名称?我在assets文件夹中有大约100个不同的db,使用100个不同的DBHelper类来解决这个问题真是太糟糕了。@andref你可以通过
super(context,nomeDb,null,1)
,我想
nomeDb
是数据库名,对吗?
//...
private static String DB_NAME = "";// Database name
    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DataBaseHelper(Context context, String nomeDB) {
        super(context, DB_NAME, null, 1);// 1? its Database Version
        DB_NAME = nomeDB;
//...