반응형

어플을 만들면서 DB 를 어떤걸로 쓸지 고민하다가

가장 가벼운? SQLite 를 쓰기로 했습니다. 우선 이전 포스팅에도 있지만 (http://kjcoder.tistory.com/27)

Xamarin 홈페이지에 가면 예시가 잘나와 있습니다.

예시를 가지고 직접 코딩한 내용을 공유해 보고자 합니다.

 

1. 사전 준비

SQLite 를 사용하기 위해서 당연히 SQLite 관련 라이브러리를 추가해야합니다.

NuGet 패키지 관리로 들어가 아래 두항목을 설치합니다.

첫번째껀 SQLite 라이브러리 이며

두번쨰껀 SQLite 를 사용하기 편하게하는 라이브러리입니다.

참조에 아래처럼 라이브러리가 추가되었으면 됩니다.

 

2. Database 생성

DB Browser 이용하여 Database 를 만드는 방법도 있지만 어플을 배포할때 DB 파일을 같이 배포하기 번거롭습니다.

그래서 직접 어플실행시 Database 파일을 만들어야 합니다.

방식은 간단합니다. 특정경로의 파일명을 가지고 Create 하면됩니다.

string DBPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments), "SMSConvey.db");

SqliteConnection.CreateFile(DBPath);

위처럼 하면 일단 Database 파일은 만들어 진것입니다.

당연히 있는데 또 만들면 에러가 발생되니 만들기 전 해당 파일이 존재하는지 확인하는건 필수입니다.

 

3. Table 생성

이제 테이블을 생성합니다. 테이블을 생성하기 위해선 테이블 구조체를 정의 해야합니다.

    public class DB_Group
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string GroupName { get; set; }
     }

보시면 아시겠지만 ID 는 PK 로 지정되었으며 자동 증가 입니다.

PK 가 반드시 존재해야합니다.

var connection = new SQLiteConnection(DBPath);
{
    connection.CreateTable<DB_Group>();

위처럼 하면 테이블이 생성됩니다.

너무 간단해서 별로 할말이 없군요;

 

4. 데이터 편집

데이터 입력도 간단합니다. 정의한 구조에 값을 셋팅하고 처리하면됩니다.

DB_Group group = new DB_Group();

group.GroupName = "testGroup"; 

var connection = new SQLiteConnection(DBPath);
{

   // 추가합니다.
   db.Insert(group);

   // 수정합니다.
   db.Update(group);

   // 삭제합니다.
   db.Delete(group);


}

 

5. 데이터 가져오기

데이터가 저장되었으면 가져오기도 해야합니다.

가져오는건 키기준으로 가져오는게 기본이니 키 기준으로 가져와 보겠습니다.

int key = 1;

var connection = new SQLiteConnection(DBPath);
{

   var query = db.Table<DB_Group>();

   DB_Group oneData = query.Where(c => c.ID == key).FirstOrDefault(); // 단일값

   List<DB_Group> multiData = query.ToList(); // 여러값

}

위 내용은 가장 기본이고 가장 기초적인 내용입니다.

당연히 비동기로 동작할수 있도록 코딩도 가능합니다.

다음 포스트에서 비동기 동작을 알아보도록 하겠습니다.

 

반응형
반응형
https://developer.xamarin.com/guides/xamarin-forms/creating-mobile-apps-xamarin-forms/

 

반응형
반응형

결과는 아래와 같다.

시간은 millisecond 단위.


millisecond CPU Memory Disk
Count Android Xamarin Android Xamarin Android Xamarin
평균 249.5 147.5 102.2 27 7708.1 12753.7
1 240 137 97 24 8321 13701
2 227 143 109 27 8048 13430
3 257 148 85 26 7737 13564
4 281 161 184 62 7792 13614
5 234 153 94 31 7713 13284
6 270 149 89 17 7524 11229
7 253 185 92 21 7471 12094
8 252 125 102 28 7889 12344
9 250 133 89 16 7318 12031
10 231 141 81 18 7268 12246



결론,

Cpu, Memory 속도는 Xamarin 이 빠르고

Disk 는 Android 가 빠르다


백만을 천만으로 했을때

Cpu 는 위 결과와 동일하게 Xamarin  이 두배 정도 빠르며

Memory 테스트는 Xamarin 으로 했을때는 결과가 나오는데 Android 로는 뻗어버린다.;

Disk 는 용량이 버티질 못할것 같아서 테스트 못했다.

 

테스트 apk 파일은 아래에...

AndroidTest1-debug-unaligned.apk

XamarinTest1.XamarinTest1-Signed.apk

비교파일.xlsx

 

반응형
반응형

이전에 만든 Tool Bar 에 메뉴를 넣어보겠습니다.

이전게시글(http://kjcoder.tistory.com/169)

 

1. 우선 메뉴에 사용될 아이콘들을 가져옵니다.

https://material.io/icons/

여기로 가면 쓸만한 아이콘들이 많이 있습니다.

drawable.zip

여기서 다루게될 아이콘들의 모음입니다.

원래 검은색인데 회색으로 변경하였습니다.

일단 준비는 끝났고 위 아이콘들을 drawable 폴더에 추가합니다.

 

2. 메뉴를 만듭니다.

Resource 폴더 하위에 menu 폴더를 하나만들고 xml 파일을 추가합니다. top_menu.xml 로 만듭니다. (이름은 맘대로)

내용은 아래와 같습니다.

<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item
       android:id="@+id/menu_Add"
       android:icon="@drawable/ic_add_black_24dp"
       android:showAsAction="ifRoom"
       android:title="추가" />
  <item
       android:id="@+id/menu_Advanced"
       android:showAsAction="never"
       android:title="Visit Site" />
</menu>

첫번째 메뉴는 추가 메뉴입니다. + 모양의 아이콘으로 보여지게됩니다.

두번째 메뉴는 아이콘이 없는 환경 설정 메뉴로 popup 메뉴를 뜨게 할수 있습니다.

* showAsAction="ifRoom" => TollBar 공간이 있으면 메뉴 항목이 표시됩니다.

* showAsAction="never" => 환경설정 메뉴항목이 설정되는 곳으로 세개의 수직점으로 나타납니다.

미리 보기

 

3. 메뉴를 보이도록 합니다.

메뉴가 추가될 화면의 Activity 에 아래 코딩을 추가합니다.

public override bool OnCreateOptionsMenu(IMenu menu)
{
    MenuInflater.Inflate(Resource.Menu.top_menus, menu);
    return base.OnCreateOptionsMenu(menu);
}

OnCreateOptionsMenu 메서드에서 메뉴 리소스를 지정할수 있게 합니다.

 

4. 메뉴 이벤트를 연결합니다.

public override bool OnOptionsItemSelected(IMenuItem item)
{
    Toast.MakeText(this, "Action selected: " + item.TitleFormatted, ToastLength.Short).Show();
    return base.OnOptionsItemSelected(item);
}

사용자가 메뉴항목을 클릭하면 OnOptionsItemSelected 메서드를 호출하고 선택한 메뉴 항목을 전달합니다.

여기서 메뉴 Action 처리를 할수 있습니다.

최종화면은 아래와 같이 나타납니다.

 

 

 

 

반응형
반응형

어플을 만들게 되면 아래 그림과 같이 상단에 Bar 가 하나 자리잡고 있습니다.

(Action Bar 가 없는 테마를 선택한 경우 보이지 않습니다.)

테마를 선택해서 없앨수는 있지만 이자리에 내가 만든 Tool Bar 를 넣는 방법을 소개하고자 합니다.

 

1. 테마 만들기

나만의 테마를 하나 만듭니다. 테마를 만드는 이유는 Action Bar  없애기 위해서라고 보면됩니다.

솔루션의 Resources/values/Style.xml 파일에 아래 코드를 작성합니다.

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <style name="MyTheme" parent="@android:style/Theme.Material.Light.DarkActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:toolBarColor">#5A8622</item>
  </style>
</resources>

핵심은 windowActionBar false 로 하여 기존 Action Bar 를 제거하는것입니다.

windowNoTitle 는 제목 표시줄을 표시 않할꺼냐 인데 표지 안할꺼니 true 입니다. (NoTitle..)

toolBarColor  Tool Bar 의 배경색이 될 항목입니다.

Properties/AndroidManifest.xml 파일의 내용에서 아래 내용을 추가하여 위 정의한 테마를 적용시킵니다.

<application android:label="SMSConvey" android:theme="@style/MyTheme"></application>

기존 application 테그가 존재하면 굵게 표시된 부분만 추가하면 됩니다.

label 은 정의한 Tool Bar 에 표시될 내용입니다.

 

2. 상단에 보여질 Tool Bar 를 디자인 합니다.

Resources/layout toolbar.xml 들어 아래코드를 작성합니다.

<?xml version="1.0" encoding="utf-8"?>
<Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/actionBarSize"
    android:background="?android:attr/toolBarColor"
    android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar"/>

minHeight="?android:attr/actionBarSize" 는 기존 제거한 Action Bar 의 높이와 동일하게 설정하라는 의미입니다.

background="?android:attr/toolBarColor" 는 배경색을 위 테마만들때 설정한 배경색을 가져옵니다.

 

3. 정의Tool Bar Include

Resources/layout/Main.axml 에서 아래 굴게 표시된 부분을 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />
    ...
    ...
 
</RelativeLayout

 

4. ToolBar 활성화

 MainActivity.cs 에서 OnCreate 부분에 아래 코딩을 추가합니다.

(아래 코딩은 빌드 단에서 에러가 안나므로 반드시 include 되었는지 확인합니다.)

var toolbar = FindViewById<Toolbar>(Resource.Id.toolbar);
SetActionBar(toolbar);
ActionBar.Title = "SMSConvey";

이렇게 하게되면 아래 처럼 내가 정의한 툴바가 나타나게 됩니다.

다음시간에는 Tool Bar 에 메뉴를 넣어보겠습니다.

 

 

반응형
반응형

https://msdn.microsoft.com/ko-kr/library/mt488768.aspx

 

https://www.xamarin.com/forms

반응형
반응형
Uri uri = Uri.parse("content://mms/");
String selection = "_id = " + mmsId;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
 
 
 
String selectionPart = "mid=" + mmsId;
Android.Net.Uri uri = Android.Net.Uri.parse("content://mms/part");
Android.Database.ICursor cursor = ContentResolver.Query(uri, null,
    selectionPart, null, null);
if (cursor.MoveToFirst())
{
    do
    {
        String partId = cursor.GetString(cursor.GetColumnIndex("_id"));
        String type = cursor.GetString(cursor.GetColumnIndex("ct"));
        if ("text/plain".Equals(type))
        {
            String data = cursor.GetString(cursor.GetColumnIndex("_data"));
            String body;
            if (data != null)
            {
                // implementation of this method below
                body = GetMmsText(partId);
            }
            else
            {
                body = cursor.GetString(cursor.GetColumnIndex("text"));
            }
        }
    } while (cursor.MoveToNext());
}

private string getMmsText(String id)
{
    Android.Net.Uri partURI = Android.Net.Uri.Parse("content://mms/part/" + id);
    Stream inputStream = null;
    Java.Lang.StringBuilder sb = new Java.Lang.StringBuilder();
    try
    {
        inputStream = ContentResolver.OpenInputStream(partURI);
        if (inputStream != null)
        {
            Java.IO.InputStreamReader isr = new Java.IO.InputStreamReader(inputStream, "UTF-8");
            Java.IO.BufferedReader reader = new Java.IO.BufferedReader(isr);
            string temp = reader.ReadLine();
            while (temp != null)
            {
                sb.Append(temp);
                temp = reader.ReadLine();
            }
        }
    }
    catch (IOException e) { }
    finally
    {
        if (inputStream != null)
        {
            try
            {
                inputStream.Close();
            }
            catch (IOException e) { }
        }
    }
    return sb.ToString();
}
 

 

반응형
반응형
1. 사용방법

2. sqlite-net 깃허브 소스
https://github.com/praeclarum/sqlite-net

3. mono.data.sqlite 설치방법

반응형
반응형

"obj\Debug\android\bin\packaged_resources" 파일이 없습니다
라는 오류는 빌드가 오류 났을때 발생되는 에러이다
출력창의 에러 내용을 모두 해결하면 된다.

오류를 다잡았는데도 오류가 발생되면

* SDK Manager 에서 아래 항목을 모두 설치한다.

Tools/
Tools/Android SDK Tools 25.1.1
Tools/Android SDK Plataform-tools 23.1
Tools/Android SDK Build-tools 23.0.1

Android 6.0/
Android 6.0/SDK
Android 6.0/ARM EABI v7a System Image

Android 5.1.1/
Android 5.1.1/SDK
Android 5.1.1/ARM EABI v7a System Image

Android 4.2.2/
Android 4.4.2/SDK
Android 4.4.2/ARM EABI v7a System Image

Android 4.0.3/
Android 4.0.3/SDK
Android 4.0.3/ARM EABI v7a System Image

Extras/
Extras/Android Support Library
Extras/Google USB Driver

 




참고
https://forums.xamarin.com/discussion/63356/the-file-obj-debug-android-bin-packaged-resources-does-not-exist

 

위 방법을 이용하니 디자이너도 잘 보인다.

반응형
반응형
// OK,Dialog팝업
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.SetTitle("확인");
alert.SetMessage("저장하시겠습니까?");
alert.SetPositiveButton("확인", SaveEvent);
alert.SetNegativeButton("취소", (senderAlert, args) => {});
Dialog dialog = alert.Create();
dialog.Show();

 private void SaveEvent(object sender, DialogClickEventArgs args)
{

 

// 단순 Dialog
public static void OpenDialogAction(Context context, string title, string content)
{
    Dialog dlg = new Dialog(context);
    TextView text = new TextView(context);
    text.Text = content;
    dlg.SetContentView(text);
    dlg.SetTitle(title);
    dlg.Show();
}

반응형

+ Recent posts