2010-07-30 8 views
4

충분히 간단한 질문이지만, 그것에 대한 개미 문신 문서를 찾을 수 없습니다. 그래서 SQLite db를 만들었지 만 두 가지 문제가 있습니다. 데이터베이스를 잘 만들고 기본 listview에 데이터를 표시 할 수 있지만 전화/에뮬레이터의 방향을 변경하면 insert 문이 다시 실행되고 모든 레코드가 복제됩니다. 임 생각하면 OnCreate() 메서드 내에있는 모든 코드와 관련이 있습니다. 그러나 내 주요 질문은 INSERT UNIQUE를 수행하거나 레코드가 존재하는지 확인하기 위해 db를 쿼리하는 방법입니다. 난 그냥 안드로이드 플랫폼에서 SQLite DB 매개 변수에 대한 좋은 설명서를 찾을 수 있습니다.안드로이드 SQLite 고유 삽입

도움이 필요합니다.

건배

답변

2

쉽게 값을 검색하기 위해 안드로이드 SDK에 이미있는 DatabaseUtils .stringForQuery() 정적 메소드의 사용을해야한다,이 예 Long

stringForQuery(SQLiteDatabase db, String query, String[] selectionArgs) 
에 대한 방법도있다 String 봇입니다

db에 대해 쿼리를 실행하고 첫 번째 행의 첫 번째 열에 값을 반환하는 유틸리티 메서드입니다.

뭔가

String myString=DatabaseUtils.stringForQuery(getDB(),query,selectionArgs); 

처럼이 예제에서는 문자열 값을 얻을 수 있었다, 그러나 당신은 쉽게 Long 값을 얻기 위해 적용 할 수 있으며, 귀하의 요청이 반환하는 경우

select count(*) from mytable where field1='stringtocheckagainst' 

과 같이해야한다 0보다 큰 숫자이면 필드가 이미 데이터베이스에 있습니다.

방향 변경을 처리하는 코드도 살펴보십시오. @nutone에 의해


UPDATE는 : API 11에

이상, 당신은 직접 (필터링) 행의 수를 얻기 위해 DatabaseUtils.queryNumEntries 기능을 사용할 수 있습니다.

long count = DatabaseUtils.queryNumEntries(getDB(), table, query, selectionArgs); 
6

SQLite는은 INSERT OR REPLACE 명령 (줄여서 REPLACE, 또는 SQLiteDatabase.replace()를 사용하는) 당신이 원하는 것을 할 수있다.

그러나 실제로 필요하지 않으면 활동이 만들어 질 때마다 데이터베이스에 응용 프로그램을 다시 삽입해서는 안되기 때문에 디자인을 변경하는 것이 좋습니다.

2

한 가지 사항은 방향 변경 문제를 처리해야하므로 모든 방향 변경시 데이터베이스에 액세스하는 데 많은 시간이 걸립니다.

두 번째 것은, 체크 중복 레코드 문제에 대한, 당신은

CREATE TABLE table_name(column_definition, unique(column_names) ON CONFLICT replace);` hen 

당신은 평소와 같이 삽입을 수행 할 수 있습니다, DB를 더 중복이 존재하지 보장 것 같은 독특한 열을 정의 할 수 있습니다.

+1

이것은 가장 좋은 답변입니다.고유성은 실제로 스키마 수준에서 처리되어야하며, 관련없는 쿼리를 사용하는 런타임에서는 처리되지 않아야합니다. 그것은 단지 더 많은 오버 헤드를 추가합니다. – hungryghost