중화사전망 - 자전 검색 - 안드로이드에서 데이터베이스를 추가, 삭제, 수정 및 검사하는 두 가지 방법은 sqlitedatabase 클래스입니까?
안드로이드에서 데이터베이스를 추가, 삭제, 수정 및 검사하는 두 가지 방법은 sqlitedatabase 클래스입니까?
Android 플랫폼에서 임베디드 관계형 데이터베이스 SQLite 가 통합됩니다. Sqlite3 은 NULL, INTEGER, REAL (부동 소수점), TEXT (문자열 텍스트) 및 BLOB (이진 객체) 데이터 유형을 지원합니다. 다섯 가지 유형만 지원하지만 SQLite3 은 실제로 varchar(n), char(n) 및 decimal(p, s) 을 받아들입니다. SQLite 의 가장 큰 특징은 필드 선언의 데이터 유형에 관계없이 모든 필드의 다양한 데이터를 저장할 수 있다는 것입니다. 예를 들어 정수 필드에 문자열을 저장하거나 부울 필드에 부동 소수점 숫자를 저장하거나 문자 필드에 날짜 값을 저장할 수 있습니다. 단, 정수 키로 정의된 필드는 64 비트 정수만 저장할 수 있으며 정수 이외의 데이터를 이 필드에 저장하면 오류가 발생합니다. 또한 CREATE TABLE 문을 작성할 때 다음 문과 같이 필드 이름 뒤에 있는 데이터 유형 정보를 생략하여 name 필드의 유형 정보를 생략할 수 있습니다.
테이블 person (personid 정수 키 자동 증가, name varchar(20))
SQLite 는 다음과 같은 대부분의 표준 SQL 문을 구문 분석할 수 있습니다.
코드 복사 코드는 다음과 같습니다.
질의문: select * from 테이블명 where 조건절 group by grouping 문 having...order by 정렬 절
예: select * from person
Select * from person order by id desc
이름 수에 따라 사원 그룹에서 이름 (*) > 1
페이징 SQL 은 MySQL 과 유사합니다. 다음 SQL 문은 5 개의 레코드를 가져오고 처음 3 개의 레코드를 건너뜁니다.
계정 한도 5 제거 3 에서 * 를 선택하거나 계정 한도 3,5 에서 * 를 선택합니다.
Insert 문: insert into 테이블명 (필드 목록) 값 (값 목록). 예: 사람 (이름, 나이) 값 ('전지전', 3) 을 삽입합니다.
Update 문: update table name set field name = value where 조건 절. 예: 개인 세트명 갱신 =' 지능 전달', 여기서 id = 10.
Delete 문: 테이블 이름에서 where 조건 절을 삭제합니다. 예를 들어, ID = 10 인 사람에게서 삭제합니다.
둘째, SQLiteOpenHelper 를 사용하여 데이터베이스 버전을 관리합니다.
데이터베이스 애플리케이션 소프트웨어를 작성할 때 고려해야 할 몇 가지 문제가 있습니다. 개발한 소프트웨어가 많은 사용자의 휴대폰에 설치될 수 있고, SQLite 데이터베이스를 사용하는 경우 사용자가 소프트웨어를 처음 사용할 때 애플리케이션에 사용되는 데이터베이스 테이블 구조를 만들고 초기화 레코드를 추가해야 하며, 소프트웨어 업그레이드 시 데이터 테이블 구조를 업데이트해야 합니다. 그러면 사용자가 소프트웨어를 처음 사용하거나 업그레이드할 때 사용자의 휴대폰에 애플리케이션에 필요한 데이터베이스 테이블을 자동으로 만들 수 있는 방법은 무엇입니까? 이 소프트웨어를 설치해야 하는 모든 휴대폰에서 데이터베이스 테이블을 수동으로 만들 수 없습니까? 이 요구 사항은 모든 데이터베이스 응용 프로그램에 직면 해 있기 때문에 안드로이드 시스템에서는 SQLiteOpenHelper 라는 추상 클래스가 제공됩니다. 이 추상 클래스는 사용하기 위해 상속되어야합니다. 데이터베이스 버전을 관리하여 이러한 요구 사항을 충족합니다.
데이터베이스 버전을 관리하기 위해 SQLiteOpenHelper 클래스는 onCreate(SQLiteDatabase db) 와 OnUpgrade (SQLite Database DB, Intold Version, 의 두 가지 중요한 메서드를 제공합니다 전자는 소프트웨어를 처음 사용할 때 데이터베이스 테이블을 생성하는 데 사용되고, 후자는 소프트웨어 업그레이드 시 데이터베이스 테이블 구조를 업데이트하는 데 사용됩니다. SQLiteOpenHelper 의 getWritableDatabase () 또는 getReadableDatabase () 메서드를 호출하여 데이터베이스를 조작하는 데 사용되는 SQLiteDatabase 인스턴스를 가져오면 Android 시스템에서 자동으로 데이터베이스를 생성합니다 OnCreate () 메서드는 데이터베이스를 처음 생성할 때만 호출됩니다. OnCreate () 메서드에서는 데이터베이스 테이블 구조를 생성하고 일부 응용 프로그램에서 사용하는 초기화 데이터를 추가할 수 있습니다. 데이터베이스 버전이 변경되면 OnUpgrade () 메서드가 호출됩니다. 일반 소프트웨어 업그레이드 시 버전 번호를 변경해야 하며 데이터베이스 버전은 프로그래머가 제어합니다. 데이터베이스의 현재 버전이 1 이라고 가정하면 비즈니스 변경으로 인해 데이터베이스 테이블 구조가 수정됩니다. 이제 소프트웨어를 업그레이드해야 합니다. 소프트웨어를 업그레이드할 때 사용자의 휴대폰에서 데이터베이스 테이블 구조를 업데이트하려고 합니다. 이를 위해 원래 데이터베이스 버전을 2 로 설정할 수 있습니다. (학우가 물어봤지만 원하시면 100 으로 설정할 수 있습니다.) onUpgrade () 메서드에서 테이블 구조를 업데이트할 수 있습니다. 소프트웨어 버전이 자주 업그레이드되면 onUpgrade () 메서드의 원본 및 대상 버전 번호를 기준으로 판단한 다음 그에 따라 테이블 구조와 데이터 업데이트를 수행할 수 있습니다.
GetWritableDatabase () 및 getReadableDatabase () 메서드는 모두 데이터베이스를 조작하는 데 사용되는 SQLiteDatabase 인스턴스를 가져올 수 있습니다. 그러나 getwritetabledatabase () 메서드는 읽기 및 쓰기를 통해 데이터베이스를 엽니다. 데이터베이스의 디스크 공간이 가득 차면 데이터베이스는 읽기만 하고 쓰기는 할 수 없습니다. Getwritetabledatabase () 를 사용하여 데이터베이스를 열면 오류가 발생합니다. GetReadableDatabase () 메서드는 먼저 데이터베이스를 읽기-쓰기 모드로 엽니다. 데이터베이스의 디스크 공간이 가득 차면 열 수 없습니다. 열 수 없는 경우 계속해서 데이터베이스를 읽기 전용 모드로 열려고 시도합니다.
주: getWritableDatabase () 와 getReadableDatabase 의 차이점은 데이터베이스가 가득 차면 전자를 호출하면 오류가 보고되고 후자를 호출하면 안 된다는 것입니다. 따라서 데이터베이스를 갱신하지 않으면 후자를 호출하여 데이터베이스 접속을 얻는 것이 좋습니다.
코드:
코드 복사 코드는 다음과 같습니다.
공용 클래스 DatabaseHelper 확장 SQLiteOpenHelper {
//이 클래스는 인스턴스화되지 않았으므로 상위 클래스 생성자의 매개 변수로 사용할 수 없으며 정적으로 선언해야 합니다.
개인 정적 최종 문자열 name = "ljqdb// 데이터베이스 이름
개인 정적 최종 int 버전 =1; //데이터베이스 버전
Public DatabaseHelper(Context 컨텍스트) {
//세 번째 매개변수인 CursorFactory 는 조회를 실행할 때 커서 인스턴스를 가져오는 팩토리 클래스를 지정합니다. Null 로 설정하면 기본 팩토리 클래스가 사용됩니다.
수퍼 (컨텍스트, 이름, super, 버전);
}
@ 덮어쓰기
Public void oncreate (SQLite database db) {
Db.exec SQL ("create table if not exists person (
Personid 정수 키 자동 증가, name varchar(20), ageinteger) ");
}
@ 덮어쓰기
Public void on upgrade (SQLite database db, int oldVersion, int newVersion) {
Db.exec SQL ("alter table person add phone varchar (12) null"); //테이블에 열 추가
// DROP TABLE IF EXISTS person 테이블을 삭제합니다.
}
}
실제 프로젝트 개발에서는 데이터베이스 테이블 구조를 업데이트할 때 사용자가 데이터베이스에 저장된 데이터를 잃지 않도록 해야 합니다.
셋째, SQLite 데이터베이스를 사용하여 SQLite 데이터베이스를 조작합니다
Android 는 데이터베이스를 조작하는 일부 API 를 캡슐화하는 SQLiteDatabase 라는 클래스를 제공합니다. 이 클래스를 사용하면 데이터 추가 (생성), 검색, 업데이트, 삭제 작업 (CRUD 라고 함) 을 완료할 수 있습니다. SQLiteDatabase 학습에서는 execSQL () 및 rawQuery () 를 중점적으로 학습해야 합니다. ExecSQL () 메서드는 테이블 삽입, 삭제, 업데이트, 만들기 등의 변경 동작이 있는 SQL 문을 실행합니다. RawQuery () 메서드는 select 문을 실행하는 데 사용됩니다.
ExecSQL () 메서드 사용 예:
코드 복사 코드는 다음과 같습니다.
SQLiteDatabase 데이터베이스 = ...;
Db.exec SQL ("insert into person (name, age) values ('Lin', 24)");
Db.close ();
위의 SQL 문을 실행하면 person 테이블에 레코드가 추가됩니다. 실제 응용 프로그램에서 보고서의 "포리스트" 매개변수 값은 사용자 입력 인터페이스에서 제공합니다. 사용자 입력이 위의 insert 문에 있는 그대로 어셈블된 경우 사용자 입력에 작은 따옴표가 포함되어 있으면 어셈블된 SQL 문에 구문 오류가 발생합니다. 이 문제를 해결하려면 작은따옴표를 이스케이프 처리하여 작은따옴표를 두 개의 작은따옴표로 변환해야 합니다. 때때로 사용자는 "&"와 같은 특수 SQL 기호를 입력하는데, 조립된 SQL 문의 구문이 정확하도록 SQL 문에서 이러한 특수 SQL 기호를 이스케이프해야 합니다. 분명히 모든 SQL 문에 대해 이렇게 하는 것은 번거롭다. SQLiteDatabase 클래스는 자리 표시자 매개 변수 (?를 사용할 수 있으므로 오버로드된 execsql (String SQL, object [] bind args) 메서드를 제공합니다 ) 을 참조하십시오. 사용 예는 다음과 같습니다.
코드 복사 코드는 다음과 같습니다.
SQLiteDatabase 데이터베이스 = ...;
Db.exec SQL ("insert into person (name, age) values (? ,? ), 새로운 개체 [] {"커뮤니케이션 팟캐스트", 4});
Db.close ();
Exec SQL (string SQL, object [] bind args) 메서드의 첫 번째 매개 변수는 SQL 문이고 두 번째 매개 변수는 SQL 문의 자리 표시자 매개 변수 값입니다. 배열에서 매개 변수 값의 순서는 자리 표시자의 위치와 일치해야 합니다.
Sqlite 데이터베이스의 RawQuery () 는 다음 예와 같이 select 문을 실행하는 데 사용됩니다.
코드 복사 코드는 다음과 같습니다.
SQLiteDatabase 데이터베이스 = ...;
Cursorcursor = db.rawquery ("select * from person", null);
While (cursor.moveToNext()) {
Intpersonid = cursor.getint (0); //첫 번째 열의 값을 가져옵니다. 첫 번째 열의 색인은 0 부터 시작합니다.
Stringname = cursor.getstring (1); //두 번째 열의 값을 가져옵니다
Intage = cursor.getint (2); //세 번째 열의 값을 가져옵니다
}
커서. close ();
Db.close ();
RawQuery () 메서드의 첫 번째 매개 변수는 select 문입니다. 두 번째 매개 변수는 select 문의 자리 표시자 매개 변수 값이며 select 문에서 자리 표시자를 사용하지 않을 경우 null 로 설정할 수 있습니다. 자리 표시자 매개변수가 있는 select 문 사용의 예는 다음과 같습니다.
코드 복사 코드는 다음과 같습니다.
Cursor cursor = db.rawquery ("select * from person where name like? 그리고 나이 =? ",새 문자열 [] {"%파슬리% ","4 "});
Cursor 는 결과 세트에 임의로 액세스하는 ResultSet 커서입니다. Jdbc 에 익숙하다면 cursor 는 실제로 JDBC 의 ResultSet 과 비슷합니다. MoveToNext () 메서드를 사용하여 커서를 현재 행에서 다음 행으로 이동합니다. 결과 세트의 마지막 행이 이동되면 false 를 반환하고, 그렇지 않으면 true 를 반환합니다. 또한 Cursor 에는 현재 행에서 이전 행으로 커서를 이동하는 일반적인 moveToPrevious () 메서드, 결과 세트의 첫 번째 행이 이동된 경우 false, 그렇지 않은 경우 true, moveToFirst () 메서드 (커서를 이동하는 데 사용됨) 가 있습니다 그렇지 않으면 True) 및 moveToLast () 메서드 (커서를 결과 세트의 마지막 행으로 이동하고 결과 세트가 비어 있으면 false, 그렇지 않으면 true) 를 반환합니다.
앞서 소개한 execSQL () 및 rawQuery () 메서드 외에도 SQLiteDatabase 는 추가, 삭제, 업데이트 및 쿼리에 해당하는 조작 메서드인 insert (), delete (), update 를 제공합니다 이 방법들은 사실 SQL 문법을 잘 모르는 초보자가 쓰는 것이다. SQL 구문에 익숙한 프로그래머의 경우 execSQL () 및 rawQuery () 메서드를 사용하여 직접 SQL 문을 실행하면 데이터 추가, 삭제, 업데이트 및 쿼리를 완료할 수 있습니다.