- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
package com.owen.quartergames.dao;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import com.owen.quartergames.R;
import com.owen.quartergames.domain.LogEntry;
public class SqlLiteFishLoggerDao extends SQLiteOpenHelper implements
FishLoggerDao {
private static final String DB_NAME = "fishingLog";
private static final String TABLE_NAME = "LogEntries";
private static final String DELETE_LOG_ENTRY_SQL = "DELETE FROM LogEntries WHERE _id = ?;";
private static final String FIND_LOG_ENTRY_SQL = "SELECT _id, Longitude, Latitude FROM LogEntries WHERE _id = ?";
private static final String FIND_ALL_ENTRIES_SQL = "SELECT * FROM LogEntries";
private static final String[] NO_ARGS = {};
private Context context;
private final SQLiteDatabase db = getWritableDatabase();
public SqlLiteFishLoggerDao(Context context) {
super(context, DB_NAME, null, 1);
this.context = context;
}
@Override
public void deleteLogEntry(String id) {
id = "0";
db.execSQL(DELETE_LOG_ENTRY_SQL, new Object[] { id });
// int deleted = db.delete(TABLE_NAME, "_id = ?",
// new String[] { id.trim() });
// Log.i("fishlogger", String.format("Delete %d rows", deleted));
db.close();
}
@Override
public LogEntry findEntry(String id) {
Cursor cursor = db.rawQuery(FIND_LOG_ENTRY_SQL, new String[] { id });
if (!cursor.moveToFirst()) {
return null;
}
LogEntry entry = new LogEntry();
entry.setId(id);
entry.setLatitude(cursor.getDouble(cursor.getColumnIndex("Latitude")));
entry
.setLongitude(cursor.getDouble(cursor
.getColumnIndex("Longitude")));
cursor.close();
db.close();
return entry;
}
@Override
public void insertLogEntry(LogEntry entry) {
ContentValues values = new ContentValues();
values.put("Latitude", entry.getLatitude());
values.put("Longitude", entry.getLongitude());
values.put("PictureURL", entry.getPictureUrl());
values.put("SizeOrWeight", entry.getSizeOrWeight());
values.put("CreateDate", entry.getEntryDate());
values.put("Species", entry.getSpecies());
db.insertOrThrow("LogEntries", null, values);
db.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
String s;
try {
Toast.makeText(context, "1", 2000).show();
InputStream in = context.getResources().openRawResource(R.raw.sql);
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document doc = builder.parse(in, null);
NodeList statements = doc.getElementsByTagName("statement");
for (int i = 0; i < statements.getLength(); i++) {
s = statements.item(i).getChildNodes().item(0).getNodeValue();
db.execSQL(s);
}
} catch (Throwable t) {
Toast.makeText(context, t.toString(), 50000).show();
}
Log.e("DB", "DB Created");
}
@Override
public List<LogEntry> findAllEntries() {
List<LogEntry> entries = new ArrayList<LogEntry>();
Cursor cursor = db.rawQuery(FIND_ALL_ENTRIES_SQL, NO_ARGS);
int entryDateCol = cursor.getColumnIndex("CreateDate");
int speciesCol = cursor.getColumnIndex("Species");
int sizeCol = cursor.getColumnIndex("SizeOrWeight");
int latCol = cursor.getColumnIndex("Latitude");
if (cursor.moveToFirst()) {
do {
LogEntry entry = new LogEntry();
entry.setEntryDate(cursor.getString(entryDateCol));
entry.setSpecies(cursor.getString(speciesCol));
entry.setSizeOrWeight(cursor.getString(sizeCol));
entry.setLatitude(cursor.getDouble(latCol));
if (entry.getSpecies() == null) {
entry.setSpecies("Not Entered");
}
if (entry.getSizeOrWeight() == null) {
entry.setSizeOrWeight("Not entered");
}
entries.add(entry);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return entries;
}
@Override
public void onUpgrade(SQLiteDatabase DB, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(getWritableDatabase());
}
}
基本上删除不起作用,但我认为问题源于 findAllEntries() 方法。我这么说的原因是我在 log cat 中收到“发现泄漏”错误,说数据库已创建但从未关闭。我已经彻底搜索了互联网并询问了编写代码但没有运气解决问题的 friend 。我所有的游标都已关闭,据我所知,这是 sqlliteopenhelper 通常应该是什么样子的。
感谢您的回复
最佳答案
您的getReadableDatabase()
打开一个数据库供读取。为避免泄漏,您需要在完成工作后将其关闭。
final db = getReadableDatabase();
//do the things
db.close();
与getWritableDatabase()
相同
关于android - 我的 SQLiteOpenHelper 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5623624/
我是 Android 开发的新手(坦率地说是整体开发),因此我一直在阅读 Commonsware Busy Coder 的指南。在阅读 SQLite 部分时,有几件事对我来说不是 %100 清楚。以下
我正在尝试在 Sqlite 数据库 中添加当前位置的纬度和经度。但是当我打开我的 Activity 时,它会崩溃并显示 android.database.sqlite.SQLiteOpenHelper
我无法理解我是如何错误地初始化数据库的: java.lang.NullPointerException at android.database.sqlite.SQLiteOpenHel
我有两个 Activity 和多个数据库类,我想在从 Activity1 到 Activity2 时传递附加信息中的数据库类名称,并在 Activity2 中加载 DatabaseAdapter 类。
我正在为我的(初学者/Android)应用程序实现一个数据库。 我不清楚是否 SQLiteOpenHelper 旨在创建数据库(物理上,写入.db/.sql 文件) super() 或者如果仍然由我来
我正在做一些测试,每次我调用 SQLiteOpenHelper.close()然后我尝试重新打开数据库,例如 SQLiteOpenHelper.getWritableDatabase()我得到异常 j
新手Q来自iPhone/MonoTouch C#背景 我有一个来自另一个项目的现有 SQLite 数据库文件。 我在哪里将数据库文件包含到我的 Eclipse 项目中以使其与应用程序一起部署。 我需要
我正在研究 Android SDK,以期为 friend 编写一个简单的应用程序(并且可能用于销售)。 此应用程序将在数据库中搜索关键字并将结果显示在屏幕上,我已经查看了 searchabul 词典和
如果一个应用程序中的多个 Activity 调用我的 SQLiteOpenHelper 的构造函数并将它们自己作为上下文参数,我可以确定它们都将访问同一个数据库吗? 例如,假设我有: package
我不知道是什么锁定了我的数据库。这个应用程序在生产中是全新的,我什至无法执行第一个将用户添加到数据库的操作。我有一个 DatabaseHandler 可以执行所有数据库操作。我的 Activity 正
通常,在 Activity 中,我是这样使用SQLiteOpenHelper DatabaseHandler mDbHelper = new DatabaseHandler(getBaseContex
我想用一些额外的方法(比如 getStreetsCursor)制作 SQLiteOpenHelper,这些方法从我的数据库返回数据。所以我写了这样的东西: public class DBHelper
我为学生创建了一个包含姓名、姓氏、分数字段的数据库,我确实成功地插入和查看了但我不知道如何进行更新和删除。 请在这里帮助我想根据ID进行更新和删除。 最佳答案 在 DatabaseHandler 类中
首先,我是 Android 应用程序的新手,并不是一个人在做这件事。我的队友在我处理这件事的同时进行了设计,并要求我设置数据库以及执行此操作的方法等等。 所以虽然大部分看起来没问题,但我说: Cont
为什么在 SQLiteOpenHelper 类变量的所有演示和教程中总是:public static final 看看: public static final String ORDER_ID
如果您扩展 SQLiteOpenHelper,您必须为构造函数使用上下文。我想知道是否有办法忽略它,并且能够在没有上下文的情况下使用数据库表。 或者至少是限制性的,我的意思是一种项目/类结构的方式,它
android.database.sqlite.SQLiteOpenHelper如果其构造函数的名称参数为 null,则提供使用内存数据库的能力: String: of the database fi
所以我想出了一些想法,我想知道它是否可以实现。 假设我有多个表(数据库模型),每个表都由某个类表示。我不习惯将单例模式与 open helper 一起使用,所以我创建了一些简单的类来提供数据库。我的想
我有一个即将发布的 Android 应用程序,我正在审查我的一些代码。我担心我的 SQLiteOpenHelper 的实现。具体来说,我想验证 onUpgrade 方法中的 oldVersion 和
我一直在使用 Android 和 SQLite 数据库开发应用程序。但我有一些问题。这是我的代码: SQLiteHelperMoney SQLiteHelperMoney1 = new
我是一名优秀的程序员,十分优秀!