这些是我表中的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方法的类.
请帮助完整的代码.
我知道有一个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().也就是说,如果该值已经在行中,则会再次插入该值,因此该行现在具有两个相同值的值.
有谁知道如何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.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类中的错误的代码(即具有最少行的代码)
初始化警报的代码:
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)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)(部分)ApodDownloader.java(包含抛出异常的行)
@Override
public void onReceive(Context …Run Code Online (Sandbox Code Playgroud)我正在创建一个与数据库进行大量交互的应用程序(读写操作).
为了避免在每个请求中打开/关闭操作,我创建了SQLiteOpenHelper一个使用Singleton设计模式扩展的类.这样,我确信SQLiteOpenHelper在整个应用程序生命周期(而不仅仅是活动生命周期)中,只有一个与数据库建立连接的实例.
我还阅读了一些关于ContentProvider的文章,但我不确定这是一个更好的方法.
所以,这是我的Singleton类的主要逻辑(onCreate并onUpgrade删除):
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) 我有这样的数据
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)
但是,它显示了我的错误.那么,我在这里做错了什么.实现这一目标的正确程序是什么?
我正在尝试更新联系人数据,并将每个数据的生日.
似乎对于我尝试的每个设备(我甚至没有尝试过那么多设备),插入有一个或多个这些问题:
我尝试过使用时间戳和完整的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)
当然,我也在这里看过这个问题,并发现了类似的问题,但是提出的解决方案似乎都没有奏效.
我应该如何将生日插入联系人?为什么每个设备都有自己的方式来解释日期?生日的正确标准是什么?
我收到谷歌播放消息,我的应用程序崩溃,在消息
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引起的.
我想用多个where条件更新我的数据库表.我已经做过单身条件
db.update(TABLE_MISSING_ITEMS, values, KEY_AUTHOR + " = ?",
new String[] { String.valueOf(items.getAuthor()) });
Run Code Online (Sandbox Code Playgroud)
现在我想要2条件.
PS: - 没有原始查询
我一直在做一些实验来测量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-sqlite ×10
android ×8
sqlite ×3
cursor ×1
database ×1
date ×1
group-concat ×1
java ×1
sql ×1
sql-insert ×1