我在多个SQLite教程中注意到,在onCreate()扩展的类的情况下重新创建表SQLiteOpenHelper.我已经在Firefox加载项的帮助下在Android环境(Eclipse IDE)之外创建了我的SQLite数据库和表.数据库表位于预期的位置:
C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets
我不得不每次都以编程方式重新创建它们(显然,它们会继续存在并保留数据,或者重点是什么)似乎很奇怪?但是,我现在对此应用程序存在严重问题,这引出了我的问题:
令我懊恼的是,我刚刚意识到我没有创建我的数据库表C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic_Project\assets,而是将它们放入C:\aXX3&Space\Android\workspace\OnDemandAndAutomatic\assets,这是应用程序的早期版本,但将SQLite文件复制到正确的位置并没有改变一点.如果这是导致问题的原因,那就是我的应用程序正在寻找AWOL数据库,仅仅复制并粘贴文件是不够的?我必须做些什么来正式
将数据库引入system/Android/Eclipse目录吗?有什么建议?
从片段我实例化这种方式
fmdata = new FileManagerData(getActivity());
Run Code Online (Sandbox Code Playgroud)
以下课程.我不明白为什么没有调用onCreate()并且我的数据库没有被创建.
public class FileManagerData {
public static final String TAG = FileManagerData.class.getSimpleName();;
Context context;
DBHelper dbHelper;
public FileManagerData (Context context){
this.context = context;
dbHelper = new DBHelper();
}
private class DBHelper extends SQLiteOpenHelper{
private static final String DB_NAME = "filename.db";
private static final String DB_SQL = "filename.sql";
private static final int DB_VERSION = 1; // internal number
public DBHelper() {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// this is NEVER …Run Code Online (Sandbox Code Playgroud) 我知道有很多关于这个问题的线索,但没有我自己的问题.我在数据库中连接了一个微调器,显示特定表的外键.并且它似乎插入错误.
02-18 11:44:34.500: E/SQLiteDatabase(20811): Error inserting ConsumerName=android.database.sqlite.SQLiteCursor@4144fa58 kWh=801.0 _id=65324 Date=2013 -2-18 Previous=98 Current=899
02-18 11:44:34.500: E/SQLiteDatabase(20811): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
public class ElectricMeterReader extends Activity {
private long rowID;
private EditText meterNoEt;
private EditText currentEt;
private EditText previousEt;
private EditText kWhEt;
private TextView dateTv;
private Spinner spinner;
private int mSpinnerSpeciesId;
private ElectricMeterReader mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.electric_meter_reader);
Bundle extras = getIntent().getExtras();
// rowID = extras.getLong(ConsumerList.ROW_ID);
dateTv = (TextView) findViewById(R.id.dateEmr); …Run Code Online (Sandbox Code Playgroud) android android-intent sqliteopenhelper android-spinner android-sqlite
当我尝试在从SQLiteOpenHelper扩展的我的DbHelper类的onCreate方法中插入记录时,此错误将会增加.
我发现了一些类似的主题:
Android getDatabase被称为递归
getWritableDatabase,递
称调用recursively getDatabase,
但这些对我没有帮助.
public class DbHelper extends SQLiteOpenHelper{
public int x=0;
public DbHelper(Context context) {
super(context, "shareholders.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
sql = "CREATE TABLE IF NOT EXISTS settings (name text,value text)";
Log.d("Ehsan", sql);
db.execSQL(sql);
ContentValues cv = new ContentValues();
cv.put("name", "Username");
cv.put("value", "");
insert("settings", cv);
cv.put("name", "Password");
cv.put("value", "");
insert("settings", cv);
cv.put("name", "PersonId");
cv.put("value", "");
insert("settings", cv);
} catch (Exception e) {
xLog.error(e.getMessage());
}
}
public …Run Code Online (Sandbox Code Playgroud) 我正在研究Android应用程序,并且在尝试将SQLite数据库数据作为TextView(表中只有一条记录)时遇到此错误.
日志和异常:
03-28 01:37:22.137: E/AndroidRuntime(9585): FATAL EXCEPTION: main
03-28 01:37:22.137: E/AndroidRuntime(9585): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tourinfo/com.example.tourinfo.TourInfo}: android.database.CursorIndexOutOfBoundsException: Index 1 requested, with a size of 1
03-28 01:37:22.137: E/AndroidRuntime(9585): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-28 01:37:22.137: E/AndroidRuntime(9585): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-28 01:37:22.137: E/AndroidRuntime(9585): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-28 01:37:22.137: E/AndroidRuntime(9585): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-28 01:37:22.137: E/AndroidRuntime(9585): at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 01:37:22.137: E/AndroidRuntime(9585): at android.os.Looper.loop(Looper.java:123)
03-28 01:37:22.137: E/AndroidRuntime(9585): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-28 01:37:22.137: E/AndroidRuntime(9585): at java.lang.reflect.Method.invokeNative(Native Method)
03-28 01:37:22.137: E/AndroidRuntime(9585): at java.lang.reflect.Method.invoke(Method.java:507)
03-28 01:37:22.137: E/AndroidRuntime(9585): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-28 01:37:22.137: E/AndroidRuntime(9585): …Run Code Online (Sandbox Code Playgroud) 我已经实现了一个房间数据库,该数据库在应用程序第一次启动时使用SQLiteAssetHelper从资源文件中分发。
数据库包含游戏状态数据,因此如果玩家想重新开始,我想再次从资源中复制数据库文件并覆盖“本地/内部”文件。
所以我的想法是删除内部数据库文件,以便SQLiteAssetHelper再次从资源中复制初始数据库。
谢谢!
凯夫
此问题仅适用于 SDK 28 设备(模拟器)。我使用 SQLiteOpenHelper 创建的 SQLite 数据库在应用程序中运行良好,但是当我将它导出到磁盘时(通过 Android Studio 或代码),它的大部分数据都丢失了。在应用程序中对此数据库所做的更改会立即反映在应用程序中,但不会反映在导出的数据库文件中。我要导出的数据库文件位于:DDMS -> 文件资源管理器 -> 数据 -> 数据 -> 我的包名称 -> 数据库 -> 我的数据库文件。在 SDK < 28 设备上,数据库文件导出得很好。
SQLiteOpenHelper和之间的区别是什么SQLiteAssetHelper?我如何使用它们?
我知道你使用SQLiteOpenHelper时必须覆盖onCreate()和onUpgrade()方法.此外,可以添加,删除和查找数据库值.
但是,我读到这SQLiteAssetHelper对于我的情况更好 - 因为我将有一个预先填充的数据库,我会做更多的查询,而不是添加或删除或其他任何东西.
所以基本上:
这两者之间的根本区别是什么?
对数据库中的数据进行查询哪个更好,这在编译时是未知的,而是在运行时?(我将使用query()或SQLiteQueryBuilder()为此.)
我该如何设置正确的?
我有时在我的logcat中得到这个错误.
无法从具有0行,64列的CursorWindow读取第0行第0列.
首先,有点背景故事.我有一个在我们组织中的许多设备上运行的应用程序.它主要运行在大约20个三星Note 8设备,2个三星Note 10.1设备和其他几个.到目前为止,问题仅发生在Note 8设备中的2个.在所有其他设备上它似乎工作得很好.
应用程序的工作原理是用户使用该应用程序收集信息,文本,照片,签名等......然后将所有这些内容作为提交表中的一行存储/插入到SQLite数据库中.提交表有64列,以满足每个收集的字段.有一个始终在运行的同步方法(它是在可运行线程内执行的AsyncTask,所以即使应用程序关闭,它仍然会在后台同步数据,除非你从android任务管理器中滑动关闭它),将数据同步到远程服务器,如果需要同步,则每10秒检查一次,例如,如果插入了新的提交,它将开始同步该提交.提交完成后,与服务器同步并收到成功响应,然后将其从设备的数据库中删除.到目前为止它已经工作得很好,数千个提交已成功同步等等.但是,我不时地从一两个特定的Note 8平板电脑中得到这一个错误,可以重现这个问题.我已经多次尝试重新创建错误,但是当我测试它并且我已经尝试了各种类型的场景来测试它时它总是有效.
我的代码是数千行,所以我会尽量保持它的相关性.首先,这是runnable的相关代码:
public Runnable myRunnable = new Runnable()
{
@Override
public void run()
{
count ++;
if(count >= 10)
{
android.util.Log.w(" SYNC ", "---------------");
android.util.Log.w(" SYNC ", "Checking if sync method is busy");
if(!syncBusy)
{
android.util.Log.w(" SYNC ", "Sync method OPEN");
doSync();//This will start doing sync.
count = 0;
}
else
{
android.util.Log.w(" SYNC ", "Sync method BUSY, will try again in 10 seconds");
android.util.Log.w(" SYNC ", "---------------");
} …Run Code Online (Sandbox Code Playgroud) 我已经使用 Room Persisdent lib 创建了 MovieDatabase。根据 RoomDatabase.Callback 中 onCreate() 方法的文档,onCreate() 在第一次创建数据库后调用,所有表都创建完毕。
在我调用 buildPersistentDB() 之后发生的事情是,我收到了来自 MoviesDatabase 类的日志,该类用@Database 进行了注释,但是尽管我调用了 RoomDatabase.Callback 中来自 onCreate() 的日志,但从未调用过:
this.mMovieDatabase = this.mMovieDBPersistentBuilder.fallbackToDestructiveMigration().build();
Run Code Online (Sandbox Code Playgroud)
我创建数据库的方式清楚地显示在 buildPersistentDB() 方法中。我还发布了 MovieDatabase 类,如下所示。
我想知道为什么我没有从 Room.Callback 中的 onCreate() 方法收到日志,尽管数据库已成功创建
代码_1:
public void buildPersistentDB() {
Log.v(TAG_LOG, "->buildPersistentDB");
this.mMovieDBPersistentBuilder = Room
.databaseBuilder(getApplicationContext(), MovieDatabase.class, ActMain.DATA_BASE_NAME);
this.mMovieDBPersistentBuilder.addCallback(new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
Log.v(TAG_LOG + "->onCreate", " buildPersistentDB->DB is created, all tables has been created");
Log.d(TAG_LOG + "->onCreate", " buildPersistentDB->DB db.getPath(): " + db.getPath()); …Run Code Online (Sandbox Code Playgroud)