标签: sqliteopenhelper

对CursorLoaders感到困惑并将它们与自定义SQLiteOpenHelper一起使用

我正在编写一个应用程序,允许人们为他们需要做的各种任务设置警报.我目前的计划是将所有相关数据存储到SQLite数据库中.为此,我创建了一个扩展SQLiteOpenHelper的类,并使用方法填充它以处理我期望必须接受的所有CRUD.知道在一个线程上执行所有处理通常是个坏主意,查找了在线程之间分离工作的方法,并找到了CursorLoader和LoaderManager,这看起来很理想,因为它们在Android兼容性库中可用.但是,LoaderManager似乎需要ContentProvider 按照文档中教程进行操作,而我还没有真正看到需要对ContentProviders做任何事情,因为我没有计划允许其他应用程序访问数据.没有ContentProvider,我不知道我应该如何为我的数据库提供一个Uri来提供给CursorLoader.有没有办法让我继续使用我的类扩展SQLiteOpenHelper并仍然实现LoaderManager,以允许我将所有填充的ListFragments与我的光标关闭UI线程?

sqlite android sqliteopenhelper android-loadermanager android-cursorloader

6
推荐指数
1
解决办法
1994
查看次数

尝试测试SQLiteOpenHelper但getWritableDatabase()会抛出Null

我正在尝试使用我的SQLiteOpenHelper对象在Android Studio中针对我的应用数据库编写junit测试.每次遇到insert方法我都会得到一个NullPointerException.我在使用getContext()和我设置的mockContext之间来回走动,但没有骰子.我启动并运行了我的模拟器.有人可以告诉我我做错了什么吗?

public class LocationDatabaseHelperTest extends AndroidTestCase {

    private SQLiteDatabase testDB;
    private SQLiteDatabase readDB;
    private LocationDatabaseHelper dbh;
    private RenamingDelegatingContext mockContext;
    private ContentValues cv;



    /**
     *Sets up a mock context to initialize the
     * LocationDatabaseHelper object.
     * @throws Exception
     */
    public void setUp() throws Exception {
        super.setUp();


        final String prefix = "test";
        mockContext = new RenamingDelegatingContext(getContext(),prefix);
        dbh = new LocationDatabaseHelper(mockContext);

        try {
            testDB = dbh.getWritableDatabase();
        } catch(Exception ex){
            ex.printStackTrace();
        }

        readDB = dbh.getReadableDatabase();
        cv = new ContentValues();
    }


    /**
     *Tests that …
Run Code Online (Sandbox Code Playgroud)

java junit android sqliteopenhelper

6
推荐指数
1
解决办法
631
查看次数

SQLiteOpenHelper多个内存数据库

android.database.sqlite.SQLiteOpenHelper如果其构造函数的name参数为null:1,则提供使用内存数据库的能力:

字符串:数据库文件的字符串,或者对于内存数据库为null

如果SQLiteOpenHelper使用nullname参数多次实例化,它们是否访问相同的内存数据库,或者每次都创建一个单独的内存数据库?

android sqliteopenhelper android-sqlite

6
推荐指数
1
解决办法
802
查看次数

SQLiteOpenHelper - 在SD卡上创建数据库

在我的测试Android应用程序中,我打算创建和访问数据库文件,它将位于SD卡上.我在一个类的帮助下使用main活动,该类扩展了SQLiteOpenHelper.我想以与以前相同的方式使用它,但我必须以某种方式更改数据库PATH.你知道吗,如何实现它?

谢谢

我当前扩展SQLiteOpenHelper的类的代码:

public class DatabaseDefinition extends SQLiteOpenHelper{
private static final String DATABASE_NAME="test.db";
private static final int DATABASE_VERSION=1;

public DatabaseDefinition(Context context) {
    super(context,DATABASE_NAME,null, DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE "+TABLE_NAME+" ("+ _ID +" INTEGER PRIMARY KEY AUTOINCREMENT, "+ NAME+" TEXT NOT NULL, " +SURNAME+" TEXT NOT NULL, "+PHONE+" INT NOT NULL);");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME);
    onCreate(db);

}
Run Code Online (Sandbox Code Playgroud)

和我的主要代码:

public class DatabaseExampleActivity extends Activity …
Run Code Online (Sandbox Code Playgroud)

database sqlite android sd-card sqliteopenhelper

5
推荐指数
1
解决办法
2万
查看次数

在Activity Activity或Application Context之间决定实例化SQLiteOpenHelper

我是Android开发的新手(总体来说是坦率的开发),因此我一直在阅读Commonsware Busy Coder的指南.在阅读SQLite部分时,有一些事情对我来说并不是100%.以下是我认为正在发生的事情以及一些问题.如果我在思考过程中出错,请纠正我.

作者建议,如果要在应用程序中使用多于一个Activity的数据库,则不应使用每个Activity的Context引用来实例化SQLiteOpenHelper.相反,您应该使用getApplicationContext()Activity提供的.

通过这样做,他使用了这样一个事实,即getApplicationContext()在应用程序进程开始后立即检索创建的Context的单例实例.这是我的问题出现的地方.我想如果我在实例化SQLiteOpenHelper时使用Activity提供的Context(this关键字),每个Activity都会创建自己的SQLiteOpenHelper实例.在我看来,仅使用Activity的Context不会通知Application Context已经创建了一个SQLiteHelper实例,因此,它创建一个新实例而不是重用现有实例.我的想法是否正确?

我认为Context(并且如果我错了,请纠正我)作为开发人员获取Android OS提供的信息和资源的"门户"(即通过获取系统服务getSystemService()).但是使用这个(来自一个Activity)或使用它getApplicationContext()有不同的含义.使用它,将获得一个Context的实例,它对您当前的Activity是"本地的",但使用getApplicationContext()引用整个应用程序.如果这是正确的,这是否意味着当我将引用传递getApplicationContext()SQLiteOpenHelper的构造函数时,它将让我的整个应用程序知道我的SQLiteOpenHelper的实例已经创建.SQLiteOpenHelper如何让应用程序了解这一点?它是否使用一些静态方法,如public/private static dbCreated(Context context){//让上下文知道这个运行的实例}让应用程序知道吗?

如果这令人困惑,我很抱歉.

提前谢谢

android-context sqliteopenhelper

5
推荐指数
1
解决办法
2581
查看次数

“显式终止方法'关闭'未调用”是什么意思?

03-02 04:23:07.015:E/StrictMode(1096):在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。03-02 04:23:07.015: E/StrictMode(1096): java.lang.Throwable: 未调用显式终止方法“close” 03-02 04:23:07.015: E/StrictMode(1096): 在 dalvik.system .CloseGuard.open(CloseGuard.java:184) 03-02 04:23:07.015: E/StrictMode(1096): at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:805) 03-02 04:23 :07.015: E/StrictMode(1096): 在 android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) 03-02 04:23:07.015: E/StrictMode(1096): 在 android.database.sqlite。 SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) 03-02 04:23:07.015: E/StrictMode(1096): 在 android.app.ContextImpl。

android sqliteopenhelper android-sqlite

5
推荐指数
1
解决办法
7676
查看次数

SQLiteOpenHelper 应用程序打开了太多文件

我的 android 应用程序遇到了问题。我遇到了这个问题:

SQLiteOpenHelper:原因:应用程序打开了太多文件。一个进程中的最大可用文件描述符默认为 1024。

(未知错误(代码 2062):无法打开数据库)

导致此问题的可能原因是什么?非常感谢你的帮助!

android sqliteopenhelper

5
推荐指数
1
解决办法
5815
查看次数

SQLiteOpenHelper 单连接与多连接

我对访问SQLiteDatabase. 它应该是一个连接或多个连接才能从多个线程访问。我已经阅读了很多文章,包括以下两篇。

/sf/answers/258291841/ http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking

这两者都建议使用单一连接。甚至我自己对同一问题的回答也被 OP 接受了。我使用了Singleton访问SQLiteopenHelper类的方法。

/sf/answers/2475109171/

但是在阅读了enableWriteAheadLogging哪些州的文档后我仍然感到困惑

此方法支持从同一数据库上的多个线程并行执行查询。它通过打开到数据库的多个连接并为每个查询使用不同的数据库连接来实现这一点。数据库日志模式也更改为允许写入与读取同时进行。

现在这是令人困惑的部分。如果我想从多个线程同时访问数据库,我可以Singleton访问SQLiteOpenHelper它,在我的理解中这意味着插入的串行执行,同时同步读取可以无错误地完成。但是上面的文档说,为了同时访问,enableWriteAheadLogging应该调用它返回创建多个连接。这是怎么回事??如果我getWritableDatabase()通过Singleton SQLiteOpenHelper从多个线程调用using来进行插入,这意味着什么?电话会是连续的吗?应该enableWriteAheadLogging叫?

请说清楚。

sqlite multithreading android sqliteopenhelper android-sqlite

5
推荐指数
1
解决办法
1192
查看次数

net.sqlcipher.database.SQLiteException: file is not a database: ,编译时: select count(*) from sqlite_master

错误这一行:

mDataBase = SQLiteDatabase.openDatabase(dbPath, "123", null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Run Code Online (Sandbox Code Playgroud)

打开数据库时。但怎么了?如何用密码打开数据库?谁能帮我?

  1. 我在 SQLITE Db 浏览器 > 文件 > 设置加密上设置密码
  2. 在android部分打开这个密码
  3. 打开时显示错误
  4. error : net.sqlcipher.database.SQLiteException: file is not a database: , while compiling: select count(*) from sqlite_master

任何人都可以帮我解决它吗?提前致谢

import android.content.Context;
import android.database.SQLException;
//import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import net.sqlcipher.database.SQLiteDatabase.CursorFactory;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import android.app.Activity;
import android.os.Bundle;

public class DatabaseHelper extends SQLiteOpenHelper {

    private static String TAG = DatabaseHelper.class.getName(); …
Run Code Online (Sandbox Code Playgroud)

sqlcipher sqliteopenhelper android-sqlite sqlcipher-android

5
推荐指数
1
解决办法
5181
查看次数

MyContentProvider.onCreate()没有被调用?

未正确调用扩展ContentProvider的userDatabase的onCreate

这是我的一些userBatabase代码:

public class userDatabase extends ContentProvider {

    private MainDatabaseHelper mOpenHelper;

    public userDatabase(){}

    public static final class MainDatabaseHelper extends SQLiteOpenHelper{...}

    @Override
    public boolean onCreate() {
        mOpenHelper = new MainDatabaseHelper(getContext());     
        return true;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        long id = mOpenHelper.getWritableDatabase().insert("Users", null, values);
        return Uri.withAppendedPath(CONTENT_URI, "" + id);
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

在我的主要活动中,我打电话:

userDatabase cpDatabase = new userDatabase();
Run Code Online (Sandbox Code Playgroud)

但是当我试着打电话的时候 cpDatabase.insert(userDatabase.CONTENT_URI, values);

mOpenHelper.getWritableDatabase().insert("Users", null, values);调用时,插入内部的所有内容都会崩溃.

我发现这mOpenHelper.getWritableDatabase()是问题,因为它甚至不会自己运行,然后我发现这是因为mOpenHelper为null.

我在构造函数中实例化mOpenHelper,所以我认为它没有运行.一些日志消息证实了这一点,当我调用userDatabase cpDatabase = new userDatabase();我的日志消息显示userDatabase()构造函数正常运行,但onCreate从未运行,因此mOpenHelper从未实例化.

(注意:有了这些日志消息,我注意到当我的应用程序启动时,我的userDatabase的构造函数和onCreate被调用.我不知道为什么或在哪里.我不明白为什么在我尝试创建实例之前运行它.即使它被运行,mOpenHelper仍然没有初始化,当我创建一个实例时,构造函数运行但是onCreate没有.)

可能会发生什么,我怎样才能让我的onCreate运行?

java database android android-contentprovider sqliteopenhelper

4
推荐指数
1
解决办法
2155
查看次数