유니티

유니티 SQLite 사용하기 -2 -유니티

파란색까마귀 2022. 2. 15. 16:42

2021. 12. 27. 19:10

https://blog.naver.com/nagne2011/222605857385

 

유니티 SQLite 사용하기 -2 -유니티

#유니티 #Unity #sqlite 우선 스크립트 생성부터 시작하자 SqliteDatabaseService 스크립트 생성후 상...

blog.naver.com

 

 

#유니티 #Unity #sqlite

 

우선 스크립트 생성부터 시작하자

SqliteDatabaseService 스크립트 생성후

상단에 Mono.Data.Sqlite, System.Data 두가지 추가해준다

using Mono.Data.Sqlite;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using UnityEngine;

public class SqliteDatabaseService {

	private IDbConnection m_dbConnection;

	public SqliteDatabaseService()
	{
		string filepath = Application.dataPath + "/StreamingAssets/testdata.db";

		m_dbConnection = new SqliteConnection("URI=file:" + filepath);
		m_dbConnection.Open();
	}

	~SqliteDatabaseService()
	{
		m_dbConnection.Close();
		m_dbConnection = null;
	}
}
 

그리고 생성자를 통해서 IDbConnection를 Open, Close해준다

DB경로는 이전에 DB파일을 옮겨둔 경로와 DB이름에 맞춰서 잡아준다

 

안드로이드나 기타 플랫폼을 사용할 경우 각 플랫폼에 맞춰서 경로를 잡아주면된다

 

이제 DB의 각 테이블과 관련된 내용이 필요한데 그전에 미리 모델클래스를 만들어서

테이블이 바로 적용되도록 잡아주자

 

using System.Data;

public interface IModel
{
	void Init(IDataRecord record, params object[] args);
}
 

먼저 각 모델에서 사용할 인터페이스를 미리 만들어주고

'생성' 함수를 추가해준다

대표사진 삭제

사진 설명을 입력하세요.

public class MainData : IModel
{
	public int MainDataId { get; set; }
	public string MainDataName { get; set; }

	public void Init(IDataRecord record, params object[] args)
	{
		MainDataId = Convert.ToInt32(record["maindata_id"]);
		MainDataName = record["maindata_name"].ToString();
	}
}
 

이전에 만들어둔 테이블을 참고해서, IModel인터페이스를 상속받는 모델클래스를 만들어주고

'생성' 함수를 채워준다

각 데이터 형식에 맞춰서 Convert와 ToString()을 활용해주자

 

만약 이후 테이블을 더 추가하거나 필드를 수정할 경우 DB에 맞춰서 클래스도 갱신해줘야된다

이렇게 해둬야 이후 데이터관리가 편하다


다시 DB관리 함수로 돌아가서,

 

SQL함수는 크게 3개에서 파생된다

INSERT, SELECT, UPDATE

각 함수에 해당하는 함수를 만들어준다

 

private int Insert(string commandString)
{
	IDbCommand command = m_dbConnection.CreateCommand();
	command.CommandType = CommandType.Text;
	command.CommandText = commandString;

	var result = command.ExecuteNonQuery();

	command.Dispose();
	command = null;

	return result;
}
 
private IDataReader Select(string commandString)
{
	IDbCommand command = m_dbConnection.CreateCommand();
	command.CommandType = CommandType.Text;
	command.CommandText = commandString;

	IDataReader reader = command.ExecuteReader();

	command.Dispose();
	command = null;

	return reader;
}
 
private int Update(string commandString)
{
	return Insert(commandString);
}
 

(UPDATE는 동일한 커맨드로 INSERT해주면된다)

 

위 기본 함수들을 사용해서 각 테이블을 개별적으로 가져오는 함수와

List에 담아서 가져오는 함수로 만들어준다

 

private T GetDataClass<T>(string commandString, params object[] args) where T : IModel, new()
{
	IDataReader reader = Select(commandString);
	T obj = new T();

	if (reader.Read())
	{
		obj.Init(reader, args);
	}

	reader.Close();
	reader = null;
		
	return obj;
}
 
private List<T> GetDataClassList<T>(string commandString, params object[] args) where T : IModel, new()
{
	IDataReader reader = Select(commandString);
	List<T> objList = Activator.CreateInstance<List<T>>();
	while (reader.Read())
	{
		T obj = new T();
		obj.Init(reader, args);
		objList.Add(obj);
	}

	return objList;
}
 

 

이제 기본 함수들은 다 만들어졌다

기존 IModel 인터페이스를 활용해두면 이런식으로 간단하게 클래스에 맞춰 함수활용할 수 있어지고

DB자체는 구조가 간단하고 바뀔 일도 적기 때문에 사용하기도 편하다

 

 

 

테스트에 앞서.. 바로 위 함수 두개는 접근권한을 public으로 변경하고

단순히 가져다 쓸수있는 컨트롤러 함수도 만들어줬다

 

대표사진 삭제

사진 설명을 입력하세요.

public class SqliteDatabaseController : MonoBehaviour {

	SqliteDatabaseService m_sqliteDatabaseService;

	public void Start()
	{
		m_sqliteDatabaseService = new SqliteDatabaseService();


		Debug.Log("0번째 데이터의 이름: " + GetMainDataWhereID(0).MainDataName);

		List<MainData> temp = GetMainDataList();
		for (int i = 0; i < temp.Count; i++)
		{
			Debug.Log(string.Format("{0}번째 : {1}", temp[i].MainDataId, temp[i].MainDataName));
		}
	}

	public List<MainData> GetMainDataList()
	{
		return m_sqliteDatabaseService.GetDataClassList<MainData>("SELECT * FROM maindata");
	}

	public MainData GetMainDataWhereID(int mainDataId)
	{
		string command = string.Format("SELECT * FROM maindata WHERE maindata_id = {0}", mainDataId);

		return m_sqliteDatabaseService.GetDataClass<MainData>(command);
	}
}
 

대충 아까 만든 sqlisteDatabaseService의 두가지 함수에

쿼리문을 작성해서 전달해주면 선텍한 IModel에 맞는 테이블에 맞춰서 데이터를 뽑아온다

 

대표사진 삭제

사진 설명을 입력하세요.

 

대표사진 삭제

사진 설명을 입력하세요.

대표사진 삭제

사진 설명을 입력하세요.

DB툴과 실제 유니티에서 나온 데이터와 비교해봐서

제대로 데이터가 읽어와지면 성공

 

 

728x90