gpt4 book ai didi

android - 我的 SQLiteOpenHelper 的问题

转载 作者:行者123 更新时间:2023-11-30 04:42:58 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com