도서 관리 시스템 개발 - Harmony 앱 프로젝트

이 문서에서는 도서 관리 시스템을 개발하는 방법을 설명합니다. 이 시스템은 관계형 데이터베이스(RelationalStore)를 활용하여 도서의 조회, 수정, 삭제 및 추가 기능을 제공합니다.

프로젝트 소개

도서 관리 시스템은 다음과 같은 주요 기능을 포함합니다:

  • 도서 조회: 사용자는 시스템에 저장된 모든 도서 정보(제목, 저자, 출판 연도 등)를 볼 수 있습니다.
  • 도서 수정: 사용자는 도서 정보를 수정할 수 있습니다(예: 제목, 저자, 출판 연도 변경).
  • 도서 삭제: 사용자는 특정 도서 레코드를 시스템에서 삭제할 수 있습니다.
  • 도서 추가: 사용자는 새로운 도서 정보를 시스템에 추가할 수 있습니다.

프로젝트 구조

<!-- common/constants/CommonConstants.ets -->
import relationalStore from '@ohos.data.relationalStore';
import Book from '../../model/Book';

export default class CommonConstants {
  static readonly STORE_CONFIG = {
    name: 'library.db',
    securityLevel: relationalStore.SecurityLevel.S1
  };

  static readonly BOOKS_TABLE = {
    tableName: 'books',
    sqlCreate: 'CREATE TABLE IF NOT EXISTS books (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, author TEXT, publicationYear TEXT, genre TEXT)'
  };
}
<!-- model/Book.ets -->
export default interface Book {
  id: number;
  title: string;
  author: string;
  publicationYear: string;
  genre: string;
}

UI 레이아웃 예시

// pages/Index.ets
import router from '@ohos.router';

@Entry
@Component
struct Index {
  build() {
    Column({ space: 10 }) {
      Text("도서 관리 시스템")
        .fontSize(50)
        .margin({ bottom: 30 });

      Button('도서 조회')
        .fontSize(20)
        .width("70%")
        .height("7%")
        .onClick(() => {
          router.pushUrl({ url: 'pages/BooksListPage', params: { state: 1 } });
        });

      Button('도서 추가')
        .fontSize(20)
        .width("70%")
        .height("7%")
        .onClick(() => {
          router.pushUrl({ url: 'pages/AddBookPage' });
        });

      Button('도서 삭제')
        .fontSize(20)
        .width("70%")
        .height("7%")
        .onClick(() => {
          router.pushUrl({ url: 'pages/BooksListPage', params: { state: 3 } });
        });

      Button('도서 수정')
        .fontSize(20)
        .width("70%")
        .height("7%")
        .onClick(() => {
          router.pushUrl({ url: 'pages/BooksListPage', params: { state: 2 } });
        });
    }
    .alignItems(HorizontalAlign.Center)
    .justifyContent(FlexAlign.Center)
    .width('100%')
    .height('100%');
  }
}

Rdb 클래스 설계

// common/database/Rdb.ets
import relationalStore from '@ohos.data.relationalStore';
import CommonConstants from '../constants/CommonConstants';

export default class Rdb {
  private dbInstance: relationalStore.RdbStore | null = null;

  constructor(callback: Function) {
    let context = getContext(this) as Context;
    relationalStore.getRdbStore(context, CommonConstants.STORE_CONFIG, (err, rdb) => {
      if (err) {
        callback(false);
        return;
      }
      this.dbInstance = rdb;
      this.createTable(CommonConstants.BOOKS_TABLE.sqlCreate, callback);
    });
  }

  createTable(sqlCreateTable: string, callback: Function) {
    if (!this.dbInstance || !sqlCreateTable) {
      callback(false);
      return;
    }
    this.dbInstance.executeSql(sqlCreateTable)
      .then(() => callback(true))
      .catch(() => callback(false));
  }

  insertData(data: relationalStore.ValuesBucket, tableName: string, callback: Function) {
    if (this.dbInstance) {
      this.dbInstance.insert(tableName, data, (err, ret) => {
        if (err) {
          callback(false);
          return;
        }
        callback(ret);
      });
    }
  }

  deleteData(predicates: relationalStore.RdbPredicates, callback: Function) {
    if (this.dbInstance) {
      this.dbInstance.delete(predicates, (err, ret) => {
        if (err) {
          callback(false);
          return;
        }
        callback(ret);
      });
    }
  }

  updateData(predicates: relationalStore.RdbPredicates, data: relationalStore.ValuesBucket, callback: Function) {
    if (this.dbInstance) {
      this.dbInstance.update(data, predicates, (err, ret) => {
        if (err) {
          callback(false);
          return;
        }
        callback(ret);
      });
    }
  }

  query(predicates: relationalStore.RdbPredicates, callback: Function) {
    if (this.dbInstance) {
      this.dbInstance.query(predicates).then((resultSet) => {
        callback(resultSet);
        resultSet.close();
      }).catch(() => callback(false));
    }
  }
}

BooksTable 클래스 설계

// common/database/tables/BooksTable.ets
import relationalStore from '@ohos.data.relationalStore';
import Book from '../../../model/Book';
import CommonConstants from '../../constants/CommonConstants';
import Rdb from '../Rdb';

export default class BooksTable {
  public static instance: BooksTable = null;
  private dbOps: Rdb;
  private tableName: string = CommonConstants.BOOKS_TABLE.tableName;
  private sqlCreateTable: string = CommonConstants.BOOKS_TABLE.sqlCreate;

  constructor(callback: Function) {
    this.dbOps = new Rdb((flag) => callback(flag));
  }

  insertData(book: Book, callback: Function) {
    const valueBucket: relationalStore.ValuesBucket = {};
    valueBucket.title = book.title;
    valueBucket.author = book.author;
    valueBucket.publicationYear = book.publicationYear;
    valueBucket.genre = book.genre;
    this.dbOps.insertData(valueBucket, this.tableName, callback);
  }

  updateData(book: Book, callback: Function) {
    const valueBucket: relationalStore.ValuesBucket = {};
    valueBucket.title = book.title;
    valueBucket.author = book.author;
    valueBucket.publicationYear = book.publicationYear;
    valueBucket.genre = book.genre;

    let predicates = new relationalStore.RdbPredicates(this.tableName);
    predicates.equalTo('id', book.id);

    this.dbOps.updateData(predicates, valueBucket, callback);
  }

  deleteById(id: number, callback: Function) {
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    predicates.equalTo('id', id);
    this.dbOps.deleteData(predicates, callback);
  }

  query(id: number, callback: Function, isAll: boolean = true) {
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    if (!isAll) {
      predicates.equalTo('id', id);
    }

    this.dbOps.query(predicates, (resultSet) => {
      let count = resultSet.rowCount;
      if (count === 0 || typeof count === 'string') {
        console.log('Query no results!');
        callback([]);
      } else {
        resultSet.goToFirstRow();
        const result: Book[] = [];
        for (let i = 0; i < count; i++) {
          let tmp: Book = {
            id: 0, title: '', author: '', publicationYear: '', genre: ''
          };
          tmp.id = resultSet.getDouble(resultSet.getColumnIndex('id'));
          tmp.title = resultSet.getString(resultSet.getColumnIndex('title'));
          tmp.author = resultSet.getString(resultSet.getColumnIndex('author'));
          tmp.publicationYear = resultSet.getString(resultSet.getColumnIndex('publicationYear'));
          tmp.genre = resultSet.getString(resultSet.getColumnIndex('genre'));
          result[i] = tmp;
          resultSet.goToNextRow();
        }
        callback(result);
      }
    });
  }

  queryById(id: number, callback: Function) {
    this.query(id, callback, false);
  }

  queryAll(callback: Function) {
    this.query(null, callback, true);
  }
}

태그: HarmonyOS RDB 도서관리시스템 UI개발

6월 4일 17:48에 게시됨