标签: android-sqlite

从表中获取一行

这些是我表中的ID:

KEY_ID(autoincremented integer primary key)   KEY_NAME(text)     KEY_PH_NO(text)

1                                             james                   1234567890
2                                             kristein                6484996755
3                                             Roen                    4668798989
4                                             Ashlie                  6897980909
Run Code Online (Sandbox Code Playgroud)

我想知道的是,如何从这个表中获取单个记录unique(KEY_ID),因为我已经建立了getContact()这样的方法,

Contact getContact(int id) {
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
            KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
            new String[] { String.valueOf(id) }, null, null, null, null);
    if (cursor != null)
        cursor.moveToFirst();

    Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
            cursor.getString(1), cursor.getString(2));
    // return contact
    return contact;
}
Run Code Online (Sandbox Code Playgroud)

并且Contact是我为所有属性设置了所有getter和setter方法的类.

请帮助完整的代码.

android-sqlite

15
推荐指数
2
解决办法
6万
查看次数

SQLiteDatabase:仅在值不存在时插入(不通过原始SQL命令)

我知道有一个SQL命令是这样的:IF NOT EXISTS但是因为Android的SQLiteDatabase类有一些很好的方法,我想知道如果通过方法不存在它是否可以插入一个值.

目前我正在使用它来插入一个String:

public long insertString(String key, String value) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(key, value);
    return db.insert(DATABASE_TABLE, null, initialValues);
}
Run Code Online (Sandbox Code Playgroud)

(db是.的一个例子SQLiteDatabase.)

我尝试了这种方法insertOrThrow()而不是insert(),但它看起来和它一样insert().也就是说,如果该值已经在行中,则会再次插入该值,因此该行现在具有两个相同值的值.

java android sql-insert android-sqlite

15
推荐指数
2
解决办法
3万
查看次数

如何使用SQLiteDatabase.CursorFactory

有谁知道如何SQLiteDatabase.CursorFactory在Android 上使用?我希望获得一个持久的SQLiteCursor对象,该对象使用SQL SELECT语句,其中几个WHERE子句表达式使用可以在重新查询之前以编程方式更改的参数.

例如:

SELECT LocationID FROM Locations WHERE Latitude < northlimit AND Latitude > southlimit AND Longitude < eastlimit AND Longitude > westlimit;
Run Code Online (Sandbox Code Playgroud)

限制参数将每200ms动态变化一次

我试图解决一个问题,如果我只是使用SQLiteDatabase.rawQuery("SELECT ...");系统为每个新查询创建一个新的CursorWindow,最终耗尽内存.所以我试图找到一种方法来强制系统不要创建新的CursorWindows.

sqlite android cursor android-sqlite

14
推荐指数
1
解决办法
3320
查看次数

在极少数情况下,"android.database.sqlite.SQLiteException:没有这样的表"错误

我在应用程序商店中有一个应用程序,但有一种类型的错误报告,我似乎无法完全弄清楚.我的应用程序使用内部sqlite数据库,但在某些设备上(当然不是大多数)有时会发生以下错误:

android.database.sqlite.SQLiteException:没有这样的表:image_data(代码1):,同时编译:SELECT Min(标记)FROM image_data WHERE category ='Astronomy'AND stamp> = 1357426800 and coalesce(title_nl,'')=' "

我确信这个表存在,我确信这个查询是正确的.我知道这个错误只发生在应用程序的小部件和AlarmManager触发的BroadcastReceiver中(应用程序偶尔尝试下载新条目,因为它是当天应用程序的图片).

我认为它与访问数据库时我所处的Context有关.我有一个名为AppContextHelper的类,它扩展了Application并且有一个静态成员,我在其中存储上下文.访问数据库时始终使用该上下文.

我的问题:在某些情况下,当获取小部件中的数据库或前面提到的由AlarmManager触发的BroadcastReceiver时,这个上下文是无效的吗?在这种情况下,我应该使用提供的Context来支持'application'上下文?如果是这样,为什么该上下文无效或更好,哪个上下文是提供的?

提前致谢!

正如请求导致问题的代码一样,仅在某些设备上,而且仅在小部件或AlarmManager类中.我将发布导致AlarmManager类中的错误的代码(即具有最少行的代码)

  1. 初始化警报的代码:

        Intent myIntent = new Intent(AppContextHelper.getContext(), ApodDownloader.class);
        mPendingIntent = PendingIntent.getBroadcast(AppContextHelper.getContext(), 0, myIntent, 0);
    
        AlarmManager alarmManager = (AlarmManager)AppContextHelper.getContext().getSystemService(Context.ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
    
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() + 10000, AlarmManager.INTERVAL_HOUR, mPendingIntent);
    
    Run Code Online (Sandbox Code Playgroud)
  2. AppContextHelper.java

    public class AppContextHelper extends Application {
    
        private static Context mContext;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mContext = this;
        }
    
        public static Context getContext(){
            return mContext;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. (部分)ApodDownloader.java(包含抛出异常的行)

    @Override
    public void onReceive(Context …
    Run Code Online (Sandbox Code Playgroud)

android android-widget android-sqlite

14
推荐指数
1
解决办法
2658
查看次数

使用Singleton设计模式正确打开/关闭数据库

我正在创建一个与数据库进行大量交互的应用程序(读写操作).

为了避免在每个请求中打开/关闭操作,我创建了SQLiteOpenHelper一个使用Singleton设计模式扩展的类.这样,我确信SQLiteOpenHelper在整个应用程序生命周期(而不仅仅是活动生命周期)中,只有一个与数据库建立连接的实例.

我还阅读了一些关于ContentProvider的文章,但我不确定这是一个更好的方法.

所以,这是我的Singleton类的主要逻辑(onCreateonUpgrade删除):

public final class BaseSQLite extends SQLiteOpenHelper {

    private static BaseSQLite mInstance = null;

    private SQLiteDatabase db = null;

    public static BaseSQLite getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new BaseSQLite(context.getApplicationContext(),
                    DBNAME, DBVERSION);
        }
        return mInstance;
    }

    private BaseSQLite(final Context context, final String name,
            final int version) {
        super(context, name, null, version);
        db = getWritableDatabase();
    }

    @Override
    public synchronized void close() { …
Run Code Online (Sandbox Code Playgroud)

android android-lifecycle sqliteopenhelper android-sqlite

14
推荐指数
1
解决办法
8486
查看次数

SQLite中的GROUP_CONCAT

我有这样的数据

1 A
1 B
1 C
1 D
2 E
2 F
3 G
3 H
3 I
3 J
3 K
Run Code Online (Sandbox Code Playgroud)

通过使用此查询

select ABSTRACTS_ITEM._id,Name 
from ABSTRACTS_ITEM , ABSTRACT_AUTHOR , AUTHORS_ABSTRACT
where
ABSTRACTS_ITEM._id = AUTHORS_ABSTRACT.ABSTRACTSITEM_ID
and
ABSTRACT_AUTHOR._id = AUTHORS_ABSTRACT.ABSTRACTAUTHOR_ID
Run Code Online (Sandbox Code Playgroud)

现在,我想显示这样的数据

1 A,B,C,D
2 EF
Run Code Online (Sandbox Code Playgroud)

等等.我也知道它可以通过GROUP_CONCAT功能来实现.所以,我尝试了这个

SELECT ABSTRACTS_ITEM._id,
GROUP_CONCAT(ABSTRACT_AUTHOR.NAME) FROM
(select ABSTRACTS_ITEM._id,
Name
from
ABSTRACTS_ITEM , ABSTRACT_AUTHOR , AUTHORS_ABSTRACT
where
ABSTRACTS_ITEM._id = AUTHORS_ABSTRACT.ABSTRACTSITEM_ID
and
ABSTRACT_AUTHOR._id = AUTHORS_ABSTRACT.ABSTRACTAUTHOR_ID)
Run Code Online (Sandbox Code Playgroud)

但是,它显示了我的错误.那么,我在这里做错了什么.实现这一目标的正确程序是什么?

sql sqlite group-concat android-sqlite

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

将生日变成联系人数据的正确方法是什么?

背景

我正在尝试更新联系人数据,并将每个数据的生日.

问题

似乎对于我尝试的每个设备(我甚至没有尝试过那么多设备),插入有一个或多个这些问题:

  • 查看/编辑联系人时,无法单击和编辑brithdate.
  • 查看/编辑联系人时,显示的格式与用户输入生日时显示的格式不同
  • 缺少一年,或完全错误的一年.
  • 查看联系人时,未显示生日,但在编辑时,会显示生日.另外,相反.

我试过的

我尝试过使用时间戳和完整的ISO8601格式(因为这个链接,意思是"yyyy-MM-dd HH:mm:ss").我也试过"yyyy-MM-dd",我尝试使用设备日期的默认格式.

所有人都有上述问题(每个问题至少有一个).

这是一段代码:

final Date birthdate = ...
// String birthdateStr = new SimpleDateFormat("yyyy-MM-dd").format(birthdate);
// String birthdateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(birthdate);
// String birthdateStr = new SimpleDateFormat(((SimpleDateFormat) java.text.DateFormat.getDateInstance(java.text.DateFormat.DEFAULT, Locale.getDefault())).toLocalizedPattern(),Locale.getDefault()).format(birthdate);


String birthdateStr = Long.toString(birthdate.getTime()/1000);
final Builder builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
builder.withValue(Data.RAW_CONTACT_ID, ...)
       .withValue(ContactsContract.Data.MIMETYPE, Event.CONTENT_ITEM_TYPE)
       .withValue(ContactsContract.CommonDataKinds.Event.START_DATE, birthdateStr)
       .withValue(ContactsContract.CommonDataKinds.Event.TYPE,
                    ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY);
Run Code Online (Sandbox Code Playgroud)

当然,我也在这里看过这个问题,并发现了类似的问题,但是提出的解决方案似乎都没有奏效.

这个问题

我应该如何将生日插入联系人?为什么每个设备都有自己的方式来解释日期?生日的正确标准是什么?

android date android-contacts android-sqlite

14
推荐指数
1
解决办法
553
查看次数

webview崩溃NullPointerException android.webkit.WebViewDatabase.initDatabase(WebViewDatabase.java:234)

我收到谷歌播放消息,我的应用程序崩溃,在消息

java.lang.NullPointerException
at android.webkit.WebViewDatabase.initDatabase(WebViewDatabase.java:234)
at android.webkit.WebViewDatabase.init(WebViewDatabase.java:212)
at android.webkit.WebViewDatabase.access$000(WebViewDatabase.java:40)
at android.webkit.WebViewDatabase$1.run(WebViewDatabase.java:193)
Run Code Online (Sandbox Code Playgroud)

我没有在google或stackoverflow中找到类似的probloem所以我不知道为什么这个crach,但我知道这是由webview引起的.

android android-webview android-sqlite

13
推荐指数
1
解决办法
1891
查看次数

SQLite数据库更新查询具有Android中的多个条件

我想用多个where条件更新我的数据库表.我已经做过单身条件

db.update(TABLE_MISSING_ITEMS, values, KEY_AUTHOR + " = ?",
                new String[] { String.valueOf(items.getAuthor()) }); 
Run Code Online (Sandbox Code Playgroud)

现在我想要2条件.

PS: - 没有原始查询

database sqlite android android-sqlite

13
推荐指数
1
解决办法
3万
查看次数

Android Sqlite性能

我一直在做一些实验来测量android上的sqlite性能.我对结果感到失望.我所做的是向表中插入10.000个查询,并且需要130-140秒 才能满足这些条件 ;

1.三星galaxy s3处于省电模式

2.插入的数据(或类)有3个字符串和1个浮点数(对于sqlite是真的)

3.插入事件正在asynctask中完成.

4.在asynctask中,我显示了一个进度对话框,其中包含传递的计时器文本(System.currentTimeMillis - seconds etc blala)

class AddStudentsTask extends AsyncTask<Void,Integer,Void>
{
    ProgressDialog prgDialog;
    int max = 10000;
    Student s;
    long seconds = System.currentTimeMillis();


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        prgDialog = new ProgressDialog(MainActivity.this);
        prgDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        prgDialog.setMessage(seconds+"");
        prgDialog.setMax(max);
        prgDialog.setCancelable(false);
        prgDialog.show();

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate();
        prgDialog.setProgress(values[0]);
        sList.add(s);
        String s = (System.currentTimeMillis()-seconds)/100+"";
        if(s.length()>2)
            s = s.substring(0,s.length()-1) + "." + s.charAt(s.length()-1);
        else if(s.length() == 2)
            s = s.charAt(0) + …
Run Code Online (Sandbox Code Playgroud)

android android-asynctask android-sqlite

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