복붙노트

[SQL] 쿼리 문자열을 사용하여 안드로이드의 SQLiteDatabase의 삽입 / 업데이트 / 삭제를 할 수있는 올바른 방법은 무엇입니까?

SQL

쿼리 문자열을 사용하여 안드로이드의 SQLiteDatabase의 삽입 / 업데이트 / 삭제를 할 수있는 올바른 방법은 무엇입니까?

나는 (http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html) 공식 문서보고 StackOverflow의 게시물과 실제 관찰 된 행동을 상호 참조하고, 문서는 것 같다 봤는데 오해의 소지가 여러면에서 아마도 단지 잘못된.

나는 하나가 rawQuery으로 선택하는 (문자열 SQL, 문자열 []에 인수) 할 수있는 것처럼, / / ​​업데이 트를 삽입, 삭제하는 매개 변수화 된 쿼리를 수행하기 위해 노력하고 있습니다. 나는 쿼리는 여러 테이블에 걸쳐 어떠한 경우에 우리는이 응용 프로그램에 사용하는 쿼리의 큰 세트를 작성한 때문에 많은 경우에 쿼리를 통해보다는의 SQLiteDatabase 클래스에 삽입 / 업데이트 / 삭제 방법을 사용하여 그것을 할 필요가 (또한 SQLite는 작성된) 우리의 모든 플랫폼에서, 그리고 그것을 그대로 사용하는 것이 매우 바람직 할 것이다.

여기에 내가 / 혼란 오해의 소지가 발견 내용은 다음과 같습니다

이 모든 결과는 내가 성공적으로 매개 변수화 인수 삽입을 실행하기 위해 찾을 수있는 유일한 방법은 하나의 작업 방법을 사용할 수 있다는 것을 명시 적으로 지시합니다하지 그 목적에 사용하는 문서.

또한, 안됐다은 정말 그 rawQuery 것 삽입 / 업데이트 / 삭제를위한하지 작업, 우리는 일반화 된 데이터 계층을 가지고 있고 우리는 모든 우리의 CRUD 쿼리를 실행하는 하나의 통합 된 API 호출을 사용하여 수 있다면 더 우아한 것이기 때문에 데이터 베이스.

그래서 여기 일이야? 이 문서의 유효 기간이 절망적인가? 그것은 삽입, 업데이트 할에는 ExecSQL를 사용하는 것이 좋아 등이 켜져 있습니까? 사람이 rawQuery에 삽입을하는 데 성공 했습니까?

부록:

안드로이드 4.3 OS에 대해 실행합니다.

샘플 쿼리 (작동하고 무엇을하지 무엇)

// Works
db.execSql("INSERT into MyTable (Col1, Col2) VALUES (?, ?)", new String[] { "Foo", "Bar" });
db.execSql("INSERT into MyTable (Col1, Col2) VALUES (?, ?);", new String[] { "Foo", "Bar" });

// No exception thrown, but no changes made to the database
db.rawQuery("INSERT into MyTable (Col1, Col2) VALUES (?, ?)", new String[] { "Foo", "Bar" });
db.rawQuery("INSERT into MyTable (Col1, Col2) VALUES (?, ?);", new String[] { "Foo", "Bar" });

해결법

  1. ==============================

    1.당신이 옳아 요. 문서는 혼란. 전반적으로, 디자인 시도는 sqlite3를 C API를 주위에 편리 자바 래퍼를 제공합니다. 당신이 그것을 디자이너가 의도하는 방식을 사용하는 경우 대부분의 시간을 위해 그것은 예를 들어, 잘 작동 CRUD 조작의 편리 방법을 사용. 편의 CRUD 방법이 충분히 또는 (표 등을 CREATE) 모두에 적용 할 수없는 강력하지 않은 경우 그러나 그들은 또한 경우에 원시 쿼리 방법에는 ExecSQL ()와 rawQuery ()를 제공 할 필요가 있었다. 이 새는 추상화가 발생합니다.

    당신이 옳아 요. 문서는 혼란. 전반적으로, 디자인 시도는 sqlite3를 C API를 주위에 편리 자바 래퍼를 제공합니다. 당신이 그것을 디자이너가 의도하는 방식을 사용하는 경우 대부분의 시간을 위해 그것은 예를 들어, 잘 작동 CRUD 조작의 편리 방법을 사용. 편의 CRUD 방법이 충분히 또는 (표 등을 CREATE) 모두에 적용 할 수없는 강력하지 않은 경우 그러나 그들은 또한 경우에 원시 쿼리 방법에는 ExecSQL ()와 rawQuery ()를 제공 할 필요가 있었다. 이 새는 추상화가 발생합니다.

    워드 프로세서 나쁜입니다. 사실, 안드로이드는 자체가 세미콜론으로 종료 쿼리 문자열로 rawQuery를 호출의 SQLiteDatabase.

    이 작업을 수행하지만 당신은 네이티브 수준에서 작동하는 방법을 이해해야합니다.

    쿼리 및 반환 성공 또는 오류 코드 중 하나를 실행 sqlite3_exec로에는 ExecSQL () () 생각.

    쿼리를 컴파일하지만 아직 실행되지 않습니다 sqlite3_prepare로 rawQuery () () 생각. 실제로는의 moveTo의 사용 하나 ... () 커서 메소드를 실행합니다. sqlite3_step로이 생각 (). 의 moveTo 어떤 rawQuery를 () () 결합하면 실제로 데이터베이스를 변경합니다.

    그것은 모든 CRUD 작업을 위해 잘 작동합니다. CRUD의 R의 읽기의 경우, 선택한 데이터를 얻을 수있는 단지 방법이 없습니다.

  2. ==============================

    2.당신이 원하는 것은 삽입물에는 ExecSQL ()입니다. 또는 당신은이 방법을 수행 할 수 있습니다 :

    당신이 원하는 것은 삽입물에는 ExecSQL ()입니다. 또는 당신은이 방법을 수행 할 수 있습니다 :

    ContentValues values = new ContentValues();
    values.put ("col1", "foo");
    values.put ("cols2", "bar");
    getDb().insertOrThrow ("MyTable", null, values);
    

    쿼리의 경우, rawQuery를 사용할 수 있습니다.

  3. from https://stackoverflow.com/questions/20110274/what-is-the-correct-way-to-do-inserts-updates-deletes-in-android-sqlitedatabase by cc-by-sa and MIT license