ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1072)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (348)
      • C++ (167)
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 알고리즘
  • Unity
  • C++
  • 언리얼
  • 배열
  • string
  • C
  • 문자열
  • 함수
  • 오블완
  • 포인터
  • SQL
  • 티스토리챌린지
  • 백준
  • 그래픽스
  • 파이썬
  • 유니티
  • c#
  • 프로그래머스
  • 클래스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[Unity] SQL 데이터 베이스 연동 SQLite
게임엔진/Unity

[Unity] SQL 데이터 베이스 연동 SQLite

2023. 3. 23. 09:30

1. Sqlite dll 다운로드

 (1) 다운로드 사이트 : https://www.sqlite.org/download.html

 

(2) Precompiled Binaries for Windows > sqlite-dll-win64-x64-xxxxxxx.zip 파일 다운로드

sqlite-dll-win64-x64-xxxxxxx.zip 파일 다운로드

 (3) Project(프로젝트) Assets 폴더 밑에 Plugins를 만든 뒤, sqlite3.def, sqlite3.dll 파일을 넣는다.  

3. Mono.Data.xxx.dll 파일 복사.

  C:\Program Files\Unity\Hub\Editor\2019.x.xxf1\Editor\Data\Mono\lib\mono\2.0에서

  Mono.Data.dll, Mono.Data.Sqlite.dll, Mono.Data.SqliteClient.dll 파일 복사하여 

  Project(프로젝트) Assets 폴더 밑에 Plugins폴더에 파일을 넣는다.  

플러그인 다운로드

Mono.Data.xxx.dll 파일 복사

4. DB Browser

 (1) 다운로드 사이트 : https://sqlitebrowser.org/dl/

 

 (2) 설치 

DB Browser

(3) DB Broser for SQLite 실행 후 새 데이터베이스(N) 클릭

그림. 새 데이터베 이스(N)

 (4) 테이블 생성

  ① 테이블 이름 입력

  ② 필드 추가 클릭

  ③ 필드 타입 선택

테이터 타입 설명
INTEGER 부호 있는 정수
REAL
부동 소수점 숫자
TEXT
텍스트
BLOB Binary Large Object. 입력 데이터를 그대로 저장

 ④ NN : Not Null. 비어 있을 경우 레코드가 생성되지 않는다.

  ⑤ PK : Primary Key. 레코드 식별자 키로 단 1개의 값만이 존재 가능하다.

  ⑥ AI : Auto Increment . 자동으로 값이 증가한다.

  ⑦ U : Unique. 단 1개의 값만이 존재 할 수 있다.

  ⑧ 필드 추가한 내용이 자동적으로 쿼리문으로 만들어진다.

테이블 정의 변경

5. DatabaseAccess.cs

using UnityEngine;
using Mono.Data.Sqlite;

public class DatabaseAccess
{
    private SqliteConnection m_DatabaseConnection;
    private SqliteCommand m_DatabaseCommand;
    private SqliteDataReader m_Reader;

    public DatabaseAccess(string connectionString)
    {
        OpenDatabase(connectionString);
    }

    public void OpenDatabase(string connectionString)
    {
        m_DatabaseConnection = new SqliteConnection(connectionString);
        m_DatabaseConnection.Open();
        Debug.Log("Connected to database");
    }

    public void CloseSqlConnection()
    {
        if (m_DatabaseCommand != null)
        {
            m_DatabaseCommand.Dispose();
        }

        m_DatabaseCommand = null;

        if (m_Reader != null)
        {
            m_Reader.Dispose();
        }

        m_Reader = null;

        if (m_DatabaseConnection != null)
        {
            m_DatabaseConnection.Close();
        }

        m_DatabaseConnection = null;
        Debug.Log("Disconnected from database.");
    }

    public SqliteDataReader ExecuteQuery(string sqlQuery)
    {
        m_DatabaseCommand = m_DatabaseConnection.CreateCommand();
        m_DatabaseCommand.CommandText = sqlQuery;

        m_Reader = m_DatabaseCommand.ExecuteReader();

        return m_Reader;
    }

    public SqliteDataReader ReadFullTable(string tableName)
    {
        string query = "SELECT * FROM " + tableName;
        return ExecuteQuery(query);
    }

    public SqliteDataReader InsertInto(string tableName, string[] values)
    {
        string query = "INSERT INTO " + tableName + " VALUES (" + values[0];
        for (int i = 1; i < values.Length; ++i)
        {
            query += ", " + values[i];
        }
        query += ")";
        return ExecuteQuery(query);
    }

    public SqliteDataReader InsertIntoSpecific(string tableName, string[] cols, string[] values)
    {
        if (cols.Length != values.Length)
        {
            throw new SqliteException("columns.Length != values.Length");
        }
        string query = "INSERT INTO " + tableName + "(" + cols[0];
        for (int i = 1; i < cols.Length; ++i)
        {
            query += ", " + cols[i];
        }
        query += ") VALUES (" + values[0];
        for (int i = 1; i < values.Length; ++i)
        {
            query += ", " + values[i];
        }
        query += ")";
        return ExecuteQuery(query);
    }

    public SqliteDataReader UpdateInto(string tableName, string[] cols, string[] colsvalues, string selectkey, string selectvalue)
    {

        string query = "UPDATE " + tableName + " SET " + cols[0] + " = " + colsvalues[0];

        for (int i = 1; i < colsvalues.Length; ++i)
        {

            query += ", " + cols[i] + " =" + colsvalues[i];
        }

        query += " WHERE " + selectkey + " = " + selectvalue + " ";

        return ExecuteQuery(query);
    }

    public SqliteDataReader DeleteContents(string tableName)
    {
        string query = "DELETE FROM " + tableName;
        return ExecuteQuery(query);
    }

    public SqliteDataReader CreateTable(string name, string[] col, string[] colType)
    {
        if (col.Length != colType.Length)
        {
            throw new SqliteException("columns.Length != colType.Length");
        }
        string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0];
        for (int i = 1; i < col.Length; ++i)
        {
            query += ", " + col[i] + " " + colType[i];
        }
        query += ")";
        return ExecuteQuery(query);
    }

    public SqliteDataReader SelectWhere(string tableName, string[] items, string[] col, string[] operation, string[] values)
    {
        if (col.Length != operation.Length || operation.Length != values.Length)
        {
            throw new SqliteException("col.Length != operation.Length != values.Length");
        }
        string query = "SELECT " + items[0];
        for (int i = 1; i < items.Length; ++i)
        {
            query += ", " + items[i];
        }
        query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' ";
        for (int i = 1; i < col.Length; ++i)
        {
            query += " AND " + col[i] + operation[i] + "'" + values[0] + "' ";
        }

        return ExecuteQuery(query);
    }
}

6. 예시

using UnityEngine;
using System.IO;

public class DemoSqlite : MonoBehaviour
{
    public string m_DatabaseFileName = "TestDatabase.db";
    public string m_TableName = "TestTable1";
    private DatabaseAccess m_DatabaseAccess;

    void Start()
    {
        string filePath = Path.Combine(Application.streamingAssetsPath, m_DatabaseFileName);
        Debug.Log(filePath);
        m_DatabaseAccess = new DatabaseAccess("data source = " + filePath);

        m_DatabaseAccess.CreateTable("TestTable1",
            new string[] { "name", "age" },
            new string[] { "text", "int" });

        m_DatabaseAccess.InsertInto("TestTable1", new string[] { "'Coderzedro'", "'47'" });
        m_DatabaseAccess.InsertInto("TestTable1", new string[] { "'JD'", "'17'" });
        m_DatabaseAccess.InsertInto("TestTable1", new string[] { "'Tiger'", "'47'" });

        m_DatabaseAccess.CloseSqlConnection();
    }
}

 

출처 : https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-SQLite

저작자표시 (새창열림)

'게임엔진 > Unity' 카테고리의 다른 글

[Unity] Job 시스템 이해 4, IJobParallelFor  (0) 2023.03.23
[Unity] Job 시스템 이해 3, JobHandle  (0) 2023.03.23
[Unity] 에디터에서만 사용할 수 있는 커스텀 코루틴  (0) 2023.02.17
[Unity] Range 어트리뷰트를 단위로 설정할 수 있는 방법  (0) 2023.02.17
[Unity] 화면 위치 > 월드 좌표 치환 RectTransformUtility  (0) 2023.02.05
    '게임엔진/Unity' 카테고리의 다른 글
    • [Unity] Job 시스템 이해 4, IJobParallelFor
    • [Unity] Job 시스템 이해 3, JobHandle
    • [Unity] 에디터에서만 사용할 수 있는 커스텀 코루틴
    • [Unity] Range 어트리뷰트를 단위로 설정할 수 있는 방법
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바