Java 无法解析符号';模式#u PRIVATE';
我正在尝试使用以下行在Android Studio中打开数据库:Java 无法解析符号';模式#u PRIVATE';,java,android,database,sqlite,android-sqlite,Java,Android,Database,Sqlite,Android Sqlite,我正在尝试使用以下行在Android Studio中打开数据库: SQLiteDatabase=openOrCreateDatabase(“myDatabase”,MODE_PRIVATE,null) 但它给我的错误是无法解析符号“MODE\u PRIVATE”。我不明白哪里出了问题,因为我在项目的其他地方使用了完全相同的代码行,在不同的类中,它以前工作得很好 我的完整代码: public class MyWorker extends Worker { public MyWorker
SQLiteDatabase=openOrCreateDatabase(“myDatabase”,MODE_PRIVATE,null)代码>
但它给我的错误是无法解析符号“MODE\u PRIVATE”
。我不明白哪里出了问题,因为我在项目的其他地方使用了完全相同的代码行,在不同的类中,它以前工作得很好
我的完整代码:
public class MyWorker extends Worker {
public MyWorker (@NonNull Context context, @NonNull WorkerParameters params) {
super(context, params);
}
@Override
public Result doWork() {
SQLiteDatabase myDatabase = openOrCreateDatabase("myDatabase",MODE_PRIVATE,null);
//Do stuff
return Result.success();
}
}
进口:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.support.annotation.NonNull;
import androidx.work.Result;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
import static android.database.sqlite.SQLiteDatabase.openOrCreateDatabase;
我一直在使用此网站帮助编写数据库代码:您尚未导入该常量:
import static android.content.Context.MODE_PRIVATE;
正如你在问题下方的评论中所看到的,@BarryFruitman指出:
SQLiteDatabase。openOrCreateDatabase()甚至不将“模式”作为
第二参数
然后我评论道:
此openOrCreateDatabase()是ContextWrapper类的一个方法
我们都是对的。
现在,在您发布了所遵循教程的链接之后,问题就暴露出来了
实际上,在本教程中,提出了以下方法:
SQLiteDatabase myDatabase = openOrCreateDatabase("myDatabase",MODE_PRIVATE,null);
这属于ContextWrapper
类,
但是在同一教程中提到的openOrCreateDatabase()
的签名是:
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)
及
它们都是SQLiteDatabase
类的成员
我相信这是教程的错误。
因此,请改为:
SQLiteDatabase gardenDatabase = SQLiteDatabase.openOrCreateDatabase(databaseNameWithPath, null);
它使用来自SQLiteDatabase
类的方法。
Edit
当然,您必须为变量databaseNameWithPath
提供完全限定的路径和数据库名称,如:
String databaseNameWithPath = "/data/data/" + <yourpackagename> + "/databases/" + "myDatabase";
String databaseNameWithPath=“/data/data/“++”/databases/“+”myDatabase”;
如果目录不存在,则创建该目录。您是否也拥有这些类中的导入语句?您可能需要“Context.MODE\u PRIVATE”。也就是说,SQLiteDatabase。openOrCreateDatabase()甚至不将“mode”作为第二个参数。您可能会将其与另一个方法或类混淆。@BarryFruitman thisopenOrCreateDatabase()
是ContextWrapper
类的一个方法,当我添加它时,它给出了错误的第二个参数类型。找到:'int',必需:“android.database.sqlite.SQLiteDatabase.CursorFactory”
导入静态android.content.Context
就足够了。@如果您不想像OP那样使用非限定常量,那么您需要像我一样对导入进行编码。@Bohemian是的,他可以通过以下方式使用它:导入静态android.content.Context
。像我一样试试。@forpas在java中,用import static android.content.Context对非限定枚举常量名MODE\u PRIVATE
进行编码代码>生成编译错误。您只能将导入编码为import static android.content.Context.MODE\u PRIVATE
或导入静态android.content.Context.*代码>。至于android studio,我不能说,因为我没有安装它来尝试。这样做会导致我的Logcat错误代码:1294(SQLITE\u CANTOPEN\u enoint),原因是:指定的目录或数据库文件不存在
String databaseNameWithPath = "/data/data/" + <yourpackagename> + "/databases/" + "myDatabase";