본문 바로가기
  • 인공지능
  • 블록체인
  • 정보보안
코딩 알로하 :: two/하이브리드앱

패스트캠퍼스 챌린지 26일차

by nathan03 2021. 11. 26.
반응형

# 강의 제목 : 누적다운로드 120만+ 1인 개발자와 함께하는 앱 개발 입문 Online

# 강의 목표 : 기초부터 운영까지 앱 개발의 전체 프로세스를 이해한다. 
                  내 이름으로 된 앱을 최대 10개까지 만들어 출시할 수 있다. 
                  앱 개발자로 성장할 수 있는 초석을 다진다. 
                  반응 얻는 앱의 특징과 노하우를 알아간다. 
                  향후 강의 없이도 나만의 앱을 개발할수 있는 실력을 가진다. 

# 강의 요약 : 프로그램 설치부터 기본 문법, 광고 다는 법, 클론코딩을 진행하며 필수 지식을 학습한다. 
                 총 10개의 다른 주제로 실제 사용화 가능한 수준의 앱을 만들어본다.
                 나의 앱을 세상에 선보이기 위한 개발자 등록 및 배포를 진행한다. 
                 강사님의 리뷰/클레임 대응사례 등 앱 성공 포인트를 참고해 1인 개발자로서의 입지를 다진다. 

 # 강의 목차 : Flutter 실전 앱 제작
                    - 앱 기능 및 디자인 설계 및 초기 구조 만들기 (눈바디앱) - 26일차
                    - 식단 기록 페이지
                    - 눈바디 운동 기록 페이지
                    - 달력 기록 페이지
                    - 달력 기록 페이지 2
                    - 통계 갤러리 알림 설정하기 
                    - 다크모드 지원하기 
                         

# 강의 화면 : 

 

# 강의 내용 : 앱 기능 및 디자인 설계 및 초기 구조 만들기 (눈바디앱)

1. 앱 디자인 
- 식단, 눈바디를 기록할 수 있음 
- 식단 사진, 시간, 종류 등 정보를 입력할 수 있음
- 운동 정보를 기록할 수 있음
- 기록페이지에서 이전 기록을 확인할 수 있음 

2. 데이터 설계 
식단   /   운동   /    눈바디 
- 날짜        - 날짜    - 날짜 
- 식단 타입  - 이름    - 사진 
- 메모         - 메모    - 메모
- 사진         - 시간
             
3. 화면 설계 
- 메인 화면 
   . 운동, 식단, 눈바디 확인 가능 
- 운동/식단/눈바디 추가 페이지 
   . 각 정보를 추가할 수 있음 
- 기록 페이지 
   . 이전 날짜 기록을 확인 할 수 있음 
- 통계 페이지 
   . 이전 기록을 통계로 확인할 수 있음 

4.  앱 디자인 



5.  데이터 설계 
# data.dart

class Food {
  int id;
  int date;
  int type;
  int kcal;
  String image;
  String memo;

  Food({this.id, this.date, this.type,
  this.kcal, this.image, this.memo});

  factory Food.fromDB(Map<String, dynamic> data){
    return Food(
      id: data["id"],
      date: data["date"],
      type: data["type"],
      kcal: data["kcal"],
      image: data["image"],
      memo: data["memo"],
    );
  }

  Map<String, dynamic> toMap() {
    return {
      "id": this.id,
      "date": this.date,
      "type": this.type,
      "kcal": this.kcal,
      "image": this.image,
      "memo": this.memo
    };
  }
}

class Workout {
  int id;
  int date;
  int time;
  String image;
  String name;
  String memo;

  Workout({this.id, this.date, this.time, this.image, this.name, this.memo});

  factory Workout.fromDB(Map<String, dynamic> data){
    return Workout(
      id: data["id"],
      date: data["date"],
      time: data["time"],
      name: data["name"],
      image: data["image"],
      memo: data["memo"],
    );
  }

  Map<String, dynamic> toMap() {
    return {
      "id": this.id,
      "date": this.date,
      "time": this.time,
      "name": this.name,
      "image": this.image,
      "memo": this.memo
    };
  }


}

class EyeBody {
  int id;
  int date;
  int weight;
  String image;

  EyeBody({this.id, this.date, this.weight, this.image});

  factory EyeBody.fromDB(Map<String, dynamic> data){
    return EyeBody(
      id: data["id"],
      date: data["date"],
      weight: data["weight"],
      image: data["image"]
    );
  }

  Map<String, dynamic> toMap(){
    return {
      "id": this.id,
      "date": this.date,
      "weight": this.weight,
      "image": this.image
    };
  }


}

6. 데이터 사용하기 위한 라이브러리 추가 
# pubspec.yaml 

dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.0
  sqflite: ^1.3.2+4

 

# database.dart

import 'package:eyebody/data/data.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';

class DatabaseHelper {

  static final _databaseName = "eyebody.db";
  static final int _databaseVersion = 1;
  static final foodTable = "food";
  static final workoutTable = "workout";
  static final eyeBodyTable = "eyeBody";

  DatabaseHelper._privateConstructor();

  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  static Database _database;

  Future<Database> get database async {
    if(_database != null) return _database;

    _database = await _initDatabase();
    return _database;
  }

  _initDatabase() async {
    var databasePath = await getDatabasesPath();
    String path = join(databasePath, _databaseName);
    return await openDatabase(path, version: _databaseVersion,
    onCreate: _onCreate, onUpgrade: _onUpgrade);
  }

  Future _onCreate(Database db, int version) async {
    await db.execute('''
    CREATE TABLE IF NOT EXISTS $foodTable (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      date INTEGER DEFAULT 0,
      type INTEGER DEFAULT 0,
      kcal INTEGER DEFAULT 0,
      image String,
      memo String
    ) 
    ''');
    await db.execute('''
    CREATE TABLE IF NOT EXISTS $workoutTable (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      date INTEGER DEFAULT 0,
      time INTEGER DEFAULT 0,
      name String,
      image String,
      memo String
    ) 
    ''');
    await db.execute('''
    CREATE TABLE IF NOT EXISTS $eyeBodyTable(
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      date INTEGER DEFAULT 0,
      weight INTEGER DEFAULT 0,
      image String
    ) 
    ''');
  }

  Future _onUpgrade(Database db, int oldVersion, int newVersion) async {}


  Future<int> insertFood(Food food) async {
    Database db = await instance.database;

    if(food.id == null){
      final map = food.toMap();
      return await db.insert(foodTable, map);
    }else{
      final map = food.toMap();
      return await db.update(foodTable, map, where: "id = ? ", whereArgs: [food.id]);
    }
  }

  Future<List<Food>> queryFoodByDate(int date) async {
    Database db = await instance.database;
    List<Food> foods = [];

    final query = await db.query(foodTable, where: "date = ?", whereArgs: [date]);

    for(final r in query){
      foods.add(Food.fromDB(r));
    }
    return foods;
  }
  Future<List<Food>> queryAllFood() async {
    Database db = await instance.database;
    List<Food> foods = [];

    final query = await db.query(foodTable);

    for(final r in query){
      foods.add(Food.fromDB(r));
    }
    return foods;
  }

  Future<int> insertWorkout(Workout workout) async {
    Database db = await instance.database;

    if(workout.id == null){
      final map = workout.toMap();
      return await db.insert(workoutTable, map);
    }else{
      final map = workout.toMap();
      return await db.update(workoutTable, map, where: "id = ? ", whereArgs: [workout.id]);
    }
  }

  Future<List<Workout>> queryWorkoutByDate(int date) async {
    Database db = await instance.database;
    List<Workout> workouts = [];

    final query = await db.query(workoutTable, where: "date = ?", whereArgs: [date]);

    for(final r in query){
      workouts.add(Workout.fromDB(r));
    }
    return workouts;
  }
  Future<List<Workout>> queryAllWorkout() async {
    Database db = await instance.database;
    List<Workout> workouts = [];

    final query = await db.query(workoutTable);

    for(final r in query){
      workouts.add(Workout.fromDB(r));
    }
    return workouts;
  }

  Future<int> insertEyeBody(EyeBody eyeBody) async {
    Database db = await instance.database;

    if(eyeBody.id == null){
      final map = eyeBody.toMap();
      return await db.insert(eyeBodyTable, map);
    }else{
      final map = eyeBody.toMap();
      return await db.update(eyeBodyTable, map, where: "id = ? ", whereArgs: [eyeBody.id]);
    }
  }

  Future<List<EyeBody>> queryEyeBodyByDate(int date) async {
    Database db = await instance.database;
    List<EyeBody> bodies = [];

    final query = await db.query(eyeBodyTable, where: "date = ?", whereArgs: [date]);

    for(final r in query){
      bodies.add(EyeBody.fromDB(r));
    }
    return bodies;
  }
  Future<List<EyeBody>> queryAllEyeBody() async {
    Database db = await instance.database;
    List<EyeBody> bodies = [];

    final query = await db.query(eyeBodyTable);

    for(final r in query){
      bodies.add(EyeBody.fromDB(r));
    }
    return bodies;
  }
}


# 교육 소감

# 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3FVdhDa

 

수강료 100% 환급 챌린지 | 패스트캠퍼스

딱 5일간 진행되는 환급챌린지로 수강료 100% 환급받으세요! 더 늦기전에 자기계발 막차 탑승!

fastcampus.co.kr

반응형

댓글