2

알아볼 수없는 매우 이상한 문제가 있습니다. 내 Sqlite DB에 새 항목을 삽입 할 수 없습니다. 이 오류를 수신 계속 : -Xamarin Sqlite-Net Insert (개체 참조가 개체의 인스턴스로 설정되지 않음)

System.NullReferenceException: Object reference not set to an instance of an object. 

말 그대로 아무 생각이 왜 똑같은 코드가 작동하고 응용 프로그램 내에서 다른 테이블을 저장합니다. 여기

내 코드입니다 : -

User.cs

public class User 
{ 
    [PrimaryKey, AutoIncrement] 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string EmailAddress { get; set; } 

    public User() 
    { 
     this.Name = " "; 
     this.EmailAddress = " "; 
    } 
} 

UserManager.cs

public class UserManager 
{ 
    UserRepository repository; 

    public UserManager(SQLiteConnection conn) 
    { 
     repository = new UserRepository (conn); 
    } 

    public User GetDriver(int id) 
    { 
     return repository.GetDriver(id); 
    } 

    public IList<User> GetDrivers() 
    { 
     return new List<User>(repository.GetDrivers()); 
    } 

    public int SaveDriver(User item) 
    { 
     return repository.SaveDriver(item); 
    } 

    public int DeleteDriver(int id) 
    { 
     return repository.DeleteDriver(id); 
    } 
} 

UserRepository.cs

,536,913,632 10
public class UserRepository 
{ 
    UserDatabase db = null; 

    public UserRepository(SQLiteConnection conn) 
    { 
     db = new UserDatabase(conn); 
    } 

    public User GetDriver(int id) 
    { 
     return db.GetDriverItem(id); 
    } 

    public IEnumerable<User> GetDrivers() 
    { 
     return db.GetAllDriverItems(); 
    } 

    public int SaveDriver(User item) 
    { 
     return db.SaveDriverItem(item); 
    } 

    public int DeleteDriver(int id) 
    { 
     return db.DeleteDriverItem(id); 
    } 
} 

UserDatabase.cs (안드로이드)

public class UserDatabase 
{ 
    static object locker = new object(); 
    public SQLiteConnection database; 
    public string path; 

    public UserDatabase(SQLiteConnection conn) 
    { 
     database = conn; 
     database.CreateTable<User>(); 
    } 

    public IEnumerable<User> GetAllDriverItems() { 
     lock (locker) { 
      return (from i in database.Table<User>() select i).ToList(); 
     } 
    } 

    public User GetDriverItem (int id) 
    { 
     lock (locker) { 
      return database.Table<User>().FirstOrDefault(x => x.ID == id); 
     } 
    } 

    public int SaveDriverItem (User item) 
    { 
     lock (locker) { 
      if (item.ID != 0) { 
       database.Update(item); 
       return item.ID; 
      } else { 
       return database.Insert(item); 
      } 
     } 
    } 

    public int DeleteDriverItem(int id) 
    { 
     lock (locker) { 
      return database.Delete<User>(id); 
     } 
    } 
} 

Application.cs 여기

public class UserApp : Application 
{ 
    public static UserApp Current { get; private set; } 

    public UserManager UserManager { get; set; } 

    SQLiteConnection conn; 

    public UserApp(IntPtr handle, global::Android.Runtime.JniHandleOwnership transfer) 
     : base(handle, transfer) 
    { 
     Current = this; 
    } 

    public override void OnCreate() 
    { 
     base.OnCreate(); 

     var sqliteFilename = "UserItemDB.db3"; 
     string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
     var path = Path.Combine(libraryPath, sqliteFilename); 
     conn = new SQLiteConnection(new SQLite.Net.Platform.Generic.SQLitePlatformGeneric(), path); 

     UserManager = new UserManager(conn); 

     User testUser= new User(); 
     testUser.Name = "Dave"; 
     testUser.EmailAddress = "[email protected]"; 
     UserApp.Current.UserManager.SaveDriver(testUser); 
    } 

내 스택 추적입니다 : -

System.NullReferenceException: Object reference not set to an instance of an object. 
08-09 17:07:32.423 E/mono (31670): at  System.Reflection.MonoProperty.GetValue (System.Object obj, System.Object[]  index) [0x00031] in <filename unknown>:0 
08-09 17:07:32.423 E/mono (31670): at  SQLite.Net.TableMapping+Column.GetValue (System.Object obj) [0x00000] in  <filename unknown>:0 
08-09 17:07:32.423 E/mono (31670): at  SQLite.Net.SQLiteConnection.Insert (System.Object obj, System.String extra,  System.Type objType) [0x00098] in <filename unknown>:0 
08-09 17:07:32.423 E/mono (31670): at  SQLite.Net.SQLiteConnection.Insert (System.Object obj) [0x00012] in <filename  unknown>:0 
08-09 17:07:32.423 E/mono (31670): at  Project.DataLayer.UserDatabase.SaveDriverItem (Project.BusinessLayer.Models.User  item) [0x00038] in  C:\Users\phill\Desktop\Work\ProjectTEST\Project\Project.Shared\DataLayer\UserDat abase.cs:42 
08-09 17:07:32.423 E/mono (31670): at  Project.DataAccessLayer.UserRepository.SaveDriver  (Project.BusinessLayer.Models.User item) [0x00001] in  C:\Users\phill\Desktop\Work\ProjectTEST\Project\Project.Shared\DataAccessLayer\U serRepository.cs:30 
08-09 17:07:32.423 E/mono (31670): at  Project.BusinessLayer.Managers.UserManager.SaveDriver  (Project.BusinessLayer.Models.User item) [0x00001] in  C:\Users\phill\Desktop\Work\ProjectTEST\Project\Project.Shared\BusinessLayer\Man agers\UserManager.cs:33 
08-09 17:07:32.423 E/mono (31670): at Project.Droid.UserApp+ <getDriverDetails>d__16.MoveNext() [0x000e2] in  C:\Users\phill\Desktop\Work\ProjectTEST\Project\Project.Droid\Application.cs:75 
+1

실행합니다. 지금은 SQL 명령을 사용하는 것으로 되돌 렸지만 이상적이지는 않습니다. – bertusaurus

+0

안녕하세요 @ BrettG86 나는 내 문제를 해결했다고 생각하니, 너와 비슷한가요? –

답변

1

가 해결 - 후 긴 두통 나는 마지막 그 문제를 알아 냈어.

그래, NullObject는 데이터베이스 파일 자체를 참조합니다. DB의 구조는 변경 될 수 없으며 Xamarin의 일부 설정으로 인해 내 응용 프로그램이 새 DB를 만들 수 없습니다. VS에서

이 도구로 이동합니다 ... 정확한 답했지만, 내 프로젝트가 마침내 직후 일이 어떤 100 % 확실하지> 옵션> 자 마린> 안드로이드> 틱 "보존 응용 프로그램 데이터"

I 이것이 주요 문제라고 생각합니다 ^^. 나는 또한 체크/체크를 남겼다.

프로젝트> 프로젝트 속성> Android 옵션> 공유 공유 시간 & 빠른 배포 및 다음 탭 링커 = 없음.

확실하지 위의 어떤 내 문제를 해결하지만 내가 같은 일을 받고 있어요 그리고 그것은 나를 미치게있어 완벽하게

+0

불행히도 내 문제를 해결하지 못했습니다. 당신은이 테이블에 대한 삽입시에만 발생한다고 말했지만, 모든 테이블에 대해 발생합니다. – bertusaurus

+0

외부 편집기에서 데이터베이스 스키마를 미리 정의하고 INT가 아닌 INTEGER로 ID를 정의하여 기본 키의 자동 증가를 직접 수행 한 경우이 기능이 유용합니다. 감사. – bertusaurus

+0

테스트로서 IDE에서 Tasky 예제를 실행하십시오. 그 코드가 잘 작동하고 VS 설정을 실행하여 다른 옵션을 확인하고 어떤 옵션이 작동하는지 확인하십시오. –