2010-07-30 4 views
2

Mac OSX에서 iPhone 및 Monitech 용 MonoTouch .NET으로 작업. 데이터베이스에서 아무 문제없이 읽을 수 있습니다. 그러나 데이터베이스를 변경하려고하면 이상한 동작이 발생합니다. 아래 코드는 예외없이 실행되지만 데이터베이스를 실제로 변경하지는 않습니다. 테이블을 만들고, 레코드를 삽입하고, 레코드를 선택하고, 콘솔에 표시 할 수 있습니다. 그러나 db 연결을 닫으면 모든 변경 사항이 사라집니다. 또한, conn.Close() 전에 코드에 중단 점을 넣고 데이터베이스를 검사하면 테이블이 존재하지 않습니다. 실제 SQL 문에 응답하는 상상의 데이터베이스로만 작업하고있는 것 같습니다. 기묘한.연결 후 SQLite 변경 사항이 손실됩니다 .Close()

코드 실행되지만 실제로 데이터베이스에 아무것도 기록하지 않습니다이 :

const string _connectionString = "Data Source=App_Data/MyDatabaseFile"; 

var conn = new SqliteConnection(_connectionString); 
conn.Open(); 

var command = conn.CreateCommand(); 

command.CommandText = "CREATE TABLE Test (id integer primary key AUTOINCREMENT, text varchar(100))"; 
command.ExecuteNonQuery(); 

var cmd2 = conn.CreateCommand(); 
cmd2.CommandText = "INSERT INTO Test (Text) Values ('test test test')"; 
var rowsAffected = cmd2.ExecuteNonQuery(); //rowsAffected is 1 

var cmd3 = conn.CreateCommand(); 
cmd3.CommandText = "SELECT * FROM Test"; 
var reader = cmd3.ExecuteReader(); 
Console.WriteLine(reader["text"]); //writes "test test test" to console, nothing in database 

conn.Close(); 

내가 SQLite는 브라우저에서 동일한 SQL 문을 실행하면

, 그들은 잘 작동 :

CREATE TABLE Test (id integer primary key AUTOINCREMENT, text varchar(100)); 
INSERT INTO Test (Text) Values ('test test test'); 
SELECT * FROM Test; 

... yield = {id = 1, text = 'test test test'}

아마 말할 수 있지만, 트랜잭션을 사용하지 않는다고 언급 할 가치가 있습니다.

UPDATE :

재미있는 ... 그 'Test2를'(존재하지 않는 테이블)에서 볼 수있는 SELECT 쿼리를 실행하고 그것이 SQLiteException가 발생하지 않습니다 위에 내가 코드를 변경할 수 있습니다 "이러한 테이블을 : Test2를" .

나는 SQLite가 트랜잭션을 필요로하는 off 기회에 트랜잭션에서 위의 코드를 래핑하려고했습니다 ... 주사위가 필요 없습니다.

업데이트 # 2 :

아담은 새 연결을 열고 응용 프로그램을 중지하기 전에 다시 새 테이블에서 선택하려고 제안했다. 나는 위의 코드 뒤에 다음 코드를 추가 :

var conn2 = new SqliteConnection(_connectionString); 
conn2.Open(); 
var cmd4 = conn2.CreateCommand(); 
cmd4.CommandText = "SELECT * FROM Test"; 
var reader2 = cmd4.ExecuteReader(); 
Console.WriteLine("2nd attempt: " + reader2["text"]); //outputs correctly 
conn.Close(); 

좋아,의 Connection.close()가 잘못 후 변경 사항을 잃는에 대한 나의 가정. 새로 삽입 된 행을 찾아서 콘솔에 출력했습니다. 그러나 응용 프로그램을 중지하면 테이블과 행이 여전히 사라집니다.

+0

이 장치 에뮬레이터 안에 있습니까? 데이터베이스를 보는 대신 코드 명령을 작성하여 방금 삽입 한 것을 선택할 수 있습니까? –

+0

예. monoDevelop와 iPhone 시뮬레이터를 사용하고 있습니다. 나는 데이터베이스를보고 있었지만 위의 코드는 삽입 된 것을 선택하려고 시도했다. –

+0

그래서 그것은 ... 그것을 발견하지 못했습니다. –

답변

2

같은 질문을 다루는 사람이라면 누구나 내 연구 결과를 게시 할 수 있다고 생각했습니다. 내 원래 게시물에 설명 된 동작은 대부분 디자인에 의한 것입니다. 더 명확히하기 위해, 여기에 더 좋은 설명이 있습니다 :

MonoDevelop가 iPhone 시뮬레이터에 응용 프로그램을 배포하면 SQLite 데이터베이스의 COPY가 iPhone 환경에 살게됩니다. 따라서 앱이 데이터베이스를 수정하면 원래 데이터베이스가 수정되지 않습니다. 앱이 멈 추면 시뮬레이터 복사본에 대한 데이터베이스 변경 사항이 손실됩니다. 그러나 앱이 실행되는 동안 원하는 모든 것을 삽입, 업데이트, 삭제 및 선택할 수 있으며 모든 것이 예상대로 작동해야합니다.

이것은 시뮬레이터를 사용할 때만 적용됩니다.

관련 문제