iOS: `get()` and `getArray()` always throw on iOS: the result set is read before `next()`
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 88/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- ios, sqlite, typescript
Hướng nghiên cứu
Bắt đầu trong src/sqlite/sqlite.ios.ts tại getRaw(), sau đó so sánh cách xử lý result set của nó với selectRaw() và các helper getResultsAsObject()/getResultsAsArray(). Xác minh việc tái hiện trên iOS cho cả get() và getArray(), bao gồm cả kết quả rỗng, và xác nhận rằng hàng đầu tiên được trả về, còn khi không có hàng nào thì trả về null mà không có TypeError.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Environment
@nativescript-community/sqlite |
3.5.9 (latest) |
@nativescript/core |
9.1.2 |
@nativescript/ios |
9.1.0 |
| NativeScript CLI | 9.1.1 |
| Xcode | 26.3 |
| Device | iPhone 16 Pro simulator, iOS 18.6 |
Android (@nativescript/android 9.1.1) is unaffected - the same code path works there.
What happens
Every call to db.get() or db.getArray() rejects, no matter what the query is or whether it matches any row:
NSqlite Error: TypeError: Cannot read properties of null (reading 'enumerateKeysAndObjectsUsingBlock')
at throwError (node_modules/@nativescript-community/sqlite/sqlite.common.js:72)
Minimal reproduction
import { openOrCreate } from '@nativescript-community/sqlite';
import { knownFolders, path } from '@nativescript/core';
const db = openOrCreate(path.join(knownFolders.documents().path, 'repro.sqlite'));
await db.execute('CREATE TABLE IF NOT EXISTS t (a INTEGER)');
await db.execute('INSERT INTO t (a) VALUES (1)');
await db.select('SELECT a FROM t'); // [{ a: 1 }]
await db.get('SELECT a FROM t'); // throws
Cause
getRaw() in src/sqlite/sqlite.ios.ts hands the fresh FMResultSet straight to getResultsAsObject() / getResultsAsArray() (links below are to the v3.5.9 tag):
and those read resultDictionary right away:
FMDB's resultDictionary describes the row the result set currently sits on, and a result set that has never been stepped sits on no row, so it returns nil - hence the TypeError on null. selectRaw() in the same file gets this right, which is why select() works and get() does not:
Suggested fix
Step onto the first row, and report "no row" rather than an empty object:
function getRaw(db: SQLiteDatabase, query: string, params: SqliteParams, asObject: boolean, options?: SqliteRequestOptions): SqliteRow | SqliteParam[] {
const s = db.db.executeQueryWithArgumentsInArray(query, paramsToStringArray(params));
if (!s) {
throw db.db.lastError();
}
if (!s.next()) {
s.close();
return null;
}
const transformBlobs = options?.transformBlobs ?? db.transformBlobs;
const row = asObject ? getResultsAsObject(s, transformBlobs) : getResultsAsArray(s, transformBlobs);
s.close();
return row;
}
get() and getArray() already coerce a falsy result to null, so the signature does not change.
Workaround
Read single rows through select() and take the first element:
const rows = await db.select(query, params);
const row = rows[0] || null;
PR
I'm happy to open a pull request with the fix above (getRaw() in src/sqlite/sqlite.ios.ts)
- Ngôn ngữ chính
- TypeScript
- Star
- 26
- Fork
- 4
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Không có hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của nativescript-community/sqlite
-
v6Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
Tất cả issue của nativescript-community/sqlite
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
NousResearch/hermes-agent#136483 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Tool errors containing cycles or BigInt crash getErrorMessage and replace the original failureĐang mởfactory-active factory-automatic task-bug-reproduction-success task-identify-harness-labels-done task-identify-issue-type-done
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
vercel/ai#22796 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[Bug]: Web chat input doesn't regain focus after a reply finishesCó thể đã có người làm @GaijinSystems đã nhận hôm nay. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
zeroclaw-labs/zeroclaw#11658 ·
Maintainer thường phản hồi trong vòng 2 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
babylonlabs-io/babylon-toolkit#2711 ·
Maintainer thường phản hồi trong vòng 1 ngày