반응형
반응형
,
반응형

realm 이 이번에 새롭게 공개되어 기존 SQLLite를 대체할 수 있게 되었습니다.


사용하기 간편하고 편리하여 이것을 사용하여 개발하면 쉽게 개발 할 수 있을 것 같습니다.


일단, realm 설치 방법 및 자세한 내용은 


https://realm.io/kr/docs/java/latest/


이 곳에서 확인 가능합니다.


realm을 인스턴스로 선언 하여 오픈시키는 코드는 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private static final int DATABASE_VERSION = 42;
private static final String DATABASE_NAME = "파일이름.realm";
 
private volatile static RealmHelper instance;
private RealmHelper() {}
public static RealmHelper getInstance() {    
    if (instance == null) {        
        synchronized (RealmHelper.class) {            
            if (instance == null) {                
                instance = new RealmHelper();            
            } 
        }    
    }    
    return instance;
}
 
private Realm realm;
 
private void openRealm() {    
    RealmConfiguration config = new RealmConfiguration.Builder(FlittoApplication.context)
                                    .name(DATABASE_NAME)            
                                    .schemaVersion(DATABASE_VERSION)            
                                    .deleteRealmIfMigrationNeeded()            
                                    .build();    
    realm = Realm.getInstance(config);
}
cs

openRealm() 을 호출하여 DB를 Open 할 수 있습니다.


RealmConfiguration를 사용하는 이유는 RealmConfiguration를 사용하지 않을 경우, 마이그레이션 익셉션이 발생할 수 있기때문에 RealmConfiguration를 선언할 때, 지정해 줍니다.


DB object를 만들 때는, 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class DBLangSet extends RealmObject {    
private String key;    
private String content;    
 
public String getKey() {        
    return key;    
}    
 
public void setKey(String key) {        
    this.key = key;    
}    
 
public String getContent() {        
    return content;    
}    
 
public void setContent(String content) {        
    this.content = content;    
}
 
}
cs



RealmObject 를 반드시 상속 시켜줘야 합니다.



반응형
,
반응형

startWith: 문자열이 지정한 문자로 시작하는지 판단 같으면 true반환 아니면 false를 반환한다.(대소문자구별)

1
2
3
String str = "apple";
boolean startsWith = str.startsWith("a");
System.out.println("startsWith: " + startsWith);

결과값:true


endWith:문자열 마지막에 지정한 문자가 있는지를 판단후 있으면 true, 없으면 false를 반환한다.(대소문자구별)

1
2
3
String str = "test";
boolean endsWith = str.endsWith("t");
System.out.println("endsWith: " + endsWith);

결과값:true


equals:두개의 String에 값만을 비교해서 같으면 true, 다르면 false를 반환한다.(대소비교)

1
2
3
4
String str1 = "java";
String str2 = "java";
boolean equals = str1.equals(str2);
System.out.println("equals: " + equals);

결과값:true


indexOf:지정한 문자가 문자열에 몇번째에 있는지를 반환한다.

1
2
3
String str = "abcdef";
int indexOf = str.indexOf("d");
System.out.println("indexOf: " + indexOf);

결과값:3


lastindexOf:문자열에 지정한 문자가 마지막몇번째에 있는 int를 반환한다.

1
2
3
String str = "AdnroidApp";
int lastIndexOf = str.lastIndexOf("A");
System.out.println("lastIndexOf:" + lastIndexOf);

결과값:7


length:문자열의 길이를 반환한다.

1
2
3
String str = "abcdef";
int length = str.length();
System.out.println("length: " + length);

결과값:6


replace:문자열에 지정한 문자" "가 있으면 새로 지정한 문자" "로 바꿔서 출력한다.

1
2
3
String str = "A*B*C*D";
String replace = str.replace("*", "-");
System.out.println("replace: " + replace);

결과값: A-B-C-D



replaceAll:정규표현식을 지정한 문자로 바꿔서 출력한다.

1
2
3
String str = "AB CD";
String replaceAll = str.replaceAll("\\p{Space}", "*");
System.out.println("replaceAll: " + replaceAll);

결과값: AB*CD


split:지정한 문자로 문자열을 나눌수 있다.(배열로 반환)

1
2
3
String str = "A:B:C:D:abcd";
String[] split = str.split(":");
System.out.println("split: " + split[1]);

결과값:B


substring:문자열에 지정한 범위에 속하는 문자열을 반환한다.(시작범위에 값은 포함하고, 끝나는 범위에 값은 포함하지않는다.)

1
2
3
String str = "ABCDEF";
String substring = str.substring(0, 2);
System.out.println("substring: " + substring);

결과값:AB


toLowerCase: 문자열에 대문자를 소문자로 변환한다.

1
2
3
String str = "abcDEF";
String toLowerCase = str.toLowerCase();
System.out.println("toLowerCase: " + toLowerCase);

결과값:abcdef


toUpperCase:문자열에 소문자를 대문자로 변환한다.

1
2
3
String str = "abcDEF";
String toUppercase = str.toUpperCase();
System.out.println("toUppercase: " + toUppercase);

결과값:ABCDEF


toString:문자열을 그대로 반환해준다.

1
2
3
String str = "1234";
String toString = str.toString();
System.out.println("toString: " + toString);

결과값:1234


trim:문자열에 공백을 없에준다.

1
2
3
4
String s = "     java java java     ";
String v;
v = s.trim();
System.out.println("trim:" + v);

결과값:java java java


valueOf:지정한 개체의 원시 값을 반환

1
2
3
4
5
6
int i = 12345;
long l = 1L;
char c = '1';
System.out.println("valueOf: " + String.valueOf (i));
System.out.println("valueOf: " + String.valueOf (l));
System.out.println("valueOf: " + String.valueOf (c));

결과값:

valueOf: 12345

valueOf: 1

valueOf: 1


compareTo:두개의 String를 앞에서부터 순사적으로 비교하다가 틀린부분이 있으면 비교하는 String에 캐릭터값을 반환한다.(대소문자를 구별)

1
2
3
4
5
6
7
8
9
10
String str1 = "A";
String str2 = "B";
int compareTo = str1.compareTo(str2);<p></p>
if(compareTo > 0){<p></p>
       System.out.println(str1 + " > " +str2);
} else if (compareTo == 0){
       System.out.println(str1 + " = " +str2);
} else{
       System.out.println(str1 + " < " +str2);
}

결과값:

A < B


contains:두개의 String을 비교해서 비교대상 String을 포함하고 있으면true, 다르면 false를 반환한다.

1
2
3
4
String str1 = "abcd";
String str2 = "c";
boolean contains = str1.contains(str2);
System.out.println("contains: " + contains);

결과값:true


charAt:지정한 index번째에 문자를 반환한다.

1
2
3
String str = "charAt";
char charAt = str.charAt(2);
System.out.println("charAt: " + charAt);

결과값:a


concat:문자와 문자를 결합해준다.

1
2
3
4
String str1 = "Han";
String str2 = "SeeJin";
String concat = str1.concat(str2);
System.out.println("concat: " + concat);

결과값:HanSeeJin


format:서식문자열을 이용해서 서식화된 문자열을 반환한다.

1
2
3
int i = 123456789;
String str = String.format("%,d", i);
System.out.println("format: " + str);

결과값:123,456,789


matches:지정한 정규 표현과 일치 할때 true를 반환한다.

1
2
3
4
5
int i = 123456;
String str1 = String.format("%,d", i);
String str2 = "123456";
boolean matches = str1.matches(str2);
System.out.println("matches: " + matches);

결과값:false


replaceFirst:문자열에 지정한 문자" "가 있으면 첫번째만 새로지정한 문자" "로 바꿔서 출력한다.

1
2
3
String str = "Aman";
String replaceFirst = str.replaceFirst("A", "super");
System.out.println("replaceFirst: " + replaceFirst);

결과값:superman


참고 : http://sks3297.tistory.com/28

반응형
,
반응형


Blue

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >

        <shape>

            <solid

                android:color="#449def" />

            <stroke

                android:width="1dp"

                android:color="#2f6699" />

            <corners

                android:radius="3dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

    <item>

        <shape>

            <gradient

                android:startColor="#449def"

                android:endColor="#2f6699"

                android:angle="270" />

            <stroke

                android:width="1dp"

                android:color="#2f6699" />

            <corners

                android:radius="4dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

</selector>

red

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >

        <shape>

            <solid

                android:color="#ef4444" />

            <stroke

                android:width="1dp"

                android:color="#992f2f" />

            <corners

                android:radius="3dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

    <item>

        <shape>

            <gradient

                android:startColor="#ef4444"

                android:endColor="#992f2f"

                android:angle="270" />

            <stroke

                android:width="1dp"

                android:color="#992f2f" />

            <corners

                android:radius="3dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

</selector> 

purple

 

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >

        <shape>

            <solid

                android:color="#a276eb" />

            <stroke

                android:width="1dp"

                android:color="#6a3ab2" />

            <corners

                android:radius="3dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

    <item>

        <shape>

            <gradient

                android:startColor="#a276eb"

                android:endColor="#6a3ab2"

                android:angle="270" />

            <stroke

                android:width="1dp"

                android:color="#6a3ab2" />

            <corners

                android:radius="4dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

</selector>

 

green

 

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >

        <shape>

            <solid

                android:color="#70c656" />

            <stroke

                android:width="1dp"

                android:color="#53933f" />

            <corners

                android:radius="3dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

    <item>

        <shape>

            <gradient

                android:startColor="#70c656"

                android:endColor="#53933f"

                android:angle="270" />

            <stroke

                android:width="1dp"

                android:color="#53933f" />

            <corners

                android:radius="4dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

</selector>

 

yellow

 

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >

        <shape>

            <solid

                android:color="#f3ae1b" />

            <stroke

                android:width="1dp"

                android:color="#bb6008" />

            <corners

                android:radius="3dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

    <item>

        <shape>

            <gradient

                android:startColor="#f3ae1b"

                android:endColor="#bb6008"

                android:angle="270" />

            <stroke

                android:width="1dp"

                android:color="#bb6008" />

            <corners

                android:radius="4dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

</selector>

 

black

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >

        <shape>

            <solid

                android:color="#343434" />

            <stroke

                android:width="1dp"

                android:color="#171717" />

            <corners

                android:radius="3dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

    <item>

        <shape>

            <gradient

                android:startColor="#343434"

                android:endColor="#171717"

                android:angle="270" />

            <stroke

                android:width="1dp"

                android:color="#171717" />

            <corners

                android:radius="4dp" />

            <padding

                android:left="10dp"

                android:top="10dp"

                android:right="10dp"

                android:bottom="10dp" />

        </shape>

    </item>

</selector>

 

style

<style name="ButtonText">

    <item name="android:layout_width">fill_parent</item>

    <item name="android:layout_height">wrap_content</item>

    <item name="android:textColor">#ffffff</item>

    <item name="android:gravity">center</item>

    <item name="android:layout_margin">3dp</item>

    <item name="android:textSize">30dp</item>

    <item name="android:textStyle">bold</item>

    <item name="android:shadowColor">#000000</item>

    <item name="android:shadowDx">1</item>

    <item name="android:shadowDy">1</item>

    <item name="android:shadowRadius">2</item>

</style> 

 

sample layout

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"

    android:orientation="vertical">

   <Button android:text="Button" android:id="@+id/button1" android:background="@drawable/btn_red" style="@style/ButtonText"></Button>

   <Button android:text="Button" android:id="@+id/button2" android:background="@drawable/btn_blue" style="@style/ButtonText"></Button>

   <Button android:text="Button" android:id="@+id/button3" android:background="@drawable/btn_purple" style="@style/ButtonText"></Button>

   <Button android:text="Button" android:id="@+id/button4" android:background="@drawable/btn_green" style="@style/ButtonText"></Button>

   <Button android:text="Button" android:id="@+id/button5" android:background="@drawable/btn_orange" style="@style/ButtonText"></Button>

   <Button android:text="Button" android:id="@+id/button6" android:background="@drawable/btn_black" style="@style/ButtonText"></Button>

</LinearLayout> 

 

http://www.dibbus.com/2012/08/more-buttons/

https://code.google.com/p/android-gradients-sample/ 

반응형
,
반응형


 TextView[] mPreNumbers = new TextView[]{

(TextView) findViewById(R.id.tv_pre1),

(TextView) findViewById(R.id.tv_pre2),

(TextView) findViewById(R.id.tv_pre3),

(TextView) findViewById(R.id.tv_pre4),

(TextView) findViewById(R.id.tv_pre5),

(TextView) findViewById(R.id.tv_pre6)

        };

HashSet<Integer> set = new HashSet<Integer>();

 

while (set.size() < 6) {

set.add((int) (Math.random() * 44) + 1);

}

Set sortedset = new TreeSet(set) ;

Object[] result = sortedset.toArray();

for (int i = 0; i < result.length ; i++) {

mPreNumbers[i].setText(result[i].toString());

System.out.println(result[i]);

}

 

 

반응형
,
반응형

안드로이드에서 URL이미지 로딩을 위해 잘만들어진 오손소스 라이브러리를 소개한다.

 

Android Universal Image Loader

Android Universal Image Loader는 많은 앱에 적용되어 있고, Executor, 스레드 풀 크기, , Bitmap Options 등 변경할 수 있는 옵션이 있다. android.app.Application 클래스를 상속한 클래스에서 ImageLoader 객체를 초기화한 후 각종 옵션을 설정하고 사용할 수 있다.

 

AQuery

AQuery는 XML 파싱과 권한 관리 등 다양한 기능을 가진 라이브러리이나 이미지 로딩과 캐시 기능도 제공하기 때문에 분석 대상으로 선정했다. jQuery와 비슷한 메서드 체인 문법을 지원한다. 

 

droid4me Bitmap Downloader

droid4me Bitmap Downloader(이하 droid4me)도 Activity 라이프사이클 관리, 예외 처리, 로깅 등의 기능을 제공하는 라이브러리이나 이미지 처리와 캐시도 제공한다. 

 

Volley Image Loader

Volley Image Loader(이하 Volley)는 Google I/O 2013에서 발표된 뜨거운 라이브러리이다. HTTP API 호출에도 초점을 맞추고 있기 때문에 HTTP 클라이언트 라이브러리로 분류할 만도 하다. Google Play 앱에 쓰였으며, Google I/O에서 관련 세션의 발표자는 Volley의 성능이 다른 모든 라이브러리를 압도했다고 자신 있게 말했다. 

 

Novoda’s Android Image Loader

Novoda’s Android Image Loader(이하 Novoda)는 이미지 로딩의 기본적인 기능에 충실한 라이브러리이다. ImageView에 Tag를 설정하여, Tag에서 URL을 불러와서 다운로드하는 방식으로 동작한다. 

 

Picasso

Picasso는 근래에 많은 오픈 소스를 공개하고 있는 Square Inc.가 개발한 라이브러리이다. Square Inc.에서 개발한 HTTP 클라이언트 오픈 소스인 OkHttp를 HTTP 클라이언트로 활용한다. 메서드 체인 방식이라 직관적이고 사용하기 편리하다. 


반응형
,
반응형

AlarmActivity.java

 // 알람 등록

    private void setAlarm(Context context, long second){  

        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

 

        Intent intent = new Intent(AlarmSetting.this, AlarmReceive.class);

        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

         

//second​ 초후에 알람 울리게 설정(1000*실제 초 ex>5초 = 5000)

 

        alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + second, pIntent);

    }

     

    // 알람 해제

    private void releaseAlarm(Context context){  

        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

 

        Intent Intent = new Intent(INTENT_ACTION);

        PendingIntent pIntent = PendingIntent.getActivity(context, 0, Intent, 0);

        alarmManager.cancel(pIntent);

         

        // 주석을 풀면 먼저 실행되는 알람이 있을 경우, 제거하고

        // 새로 알람을 실행하게 된다. 상황에 따라 유용하게 사용 할 수 있다.

//      alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, pIntent);

    }

 

 

AlarmReceive .java

 public class AlarmReceive extends BroadcastReceiver {

 

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

Toast.makeText(context, "Alarm Received!", Toast.LENGTH_LONG).show();

 

NotificationManager notifier = (NotificationManager) context

.getSystemService(Context.NOTIFICATION_SERVICE);

 

Notification notify = new Notification(R.drawable.ic_launcher, "text", System.currentTimeMillis());

 

Intent intent2 = new Intent(context, CallResultActivity.class);

PendingIntent pender = PendingIntent.getActivity(context, 0, intent2, 0);

 

notify.setLatestEventInfo(context, "alimtitle", "hackjang", pender);

 

notify.flags |= Notification.FLAG_AUTO_CANCEL;

notify.vibrate = new long[] { 200, 200, 500, 300 };

// notify.sound=Uri.parse("file:/");

notify.number++;

 

notifier.notify(1, notify);

}

 

}

 

※여기서 중요한 것은 BroadcastReceiver  사용할때 manifast.xml에

<receiver android:name=".AlarmReceive"/> <--이것을 반드시 추가 할 것!!

 

 

 


반응형
,
반응형

http://www.netmite.com/android/mydroid/2.0/packages/apps/ 

 

다운 받는 방법을 모르겠다 ㅠㅠ소스 참고할때 유용할 듯


반응형
,
반응형

try {

PackageInfo info = getPackageManager().getPackageInfo(

            "패키지명", 

            PackageManager.GET_SIGNATURES);

for (Signature signature : info.signatures) {

MessageDigest md = MessageDigest.getInstance("SHA");

  md.update(signature.toByteArray());

  Log.d("debug", Base64.encodeToString(md.digest(), Base64.DEFAULT));

}

} catch (NameNotFoundException e) {

} catch (NoSuchAlgorithmException e) {

}

반응형
,
반응형

데이터 구조가 잡히기 전 임시? 데이터 파일용으로 xml을 사용하려고 합니다. 뭐 만들어두면 간단한 설정파일등에 사용도 가능하구요.


기존에 잘 썼던 TinyXml을 쓸까 하다가 MSXml과 XmlLite등 다른 것들도 포착이 되네요. 세부적으로 프로그래밍 API까진 아니고 간단하게 리서치 한 내용을 포스팅 해봅니다.

  • XML 파싱 방식
SAX(Simple API for XML)와 DOM(Document Object Model)이 있습니다.

  • SAX(Simple API for XML)
XML문서 구성요소를 읽어 들일때마다 이벤트로 처리해 주기 때문에 대용량 처리에 적합하고 빠르고, 대용량 문서나 많은 문서를 처리할 때 적절합니다. 단점으로는 읽어낸 데이터를 다시 이용할 수 없어 재활용하려면 자료구조를 따로 만들어줘야 합니다.
  • DOM(Document Object Model)
각각의 구성요소를 객체로 모델링화해서 객체가 가진 속성과 메소드를 통해 문서의 구조와 데이터를 다룰 수 있도록 W3C가 국제표준으로 제안한 XML 프로그래밍 인터페이스입니다.

XML 문서를 해석하여 DOMTree형태로 메모리에 올립니다. 해서 자료구조를 가지고 있어서 데이터를 바로 읽고 수정뿐 아니라 노드 추가등의 작업도 가능합니다. SAX보단 느립니다.
DOM 방식
UTF-8 파싱을 지원하지만 기본적으로 유니코드로 컴파일이 안된다.
UTF-8로 된 파일에서 한글을 읽을 때 MultiByteToWideChar에 CP_UTF8옵션으로 읽을 것.
UTF-16미지원

    • MSXML
DOM 방식.
COM.
SAX도 지원하는듯.
MSXML버젼 때문에 정상적으로 파싱 하지 못하는 경우가 발생할 수 있다. 별도 MSXML 배포버젼이 있지만 일반적으로 유저들은 IE를 설치할 때 같이 배포된 MSXML을 사용하기 때문에 사용자의  IE버젼과 OS버젼에 따라 이런 경우가 발생한다.
이걸로 개발하면 유저들도 닷넷 프레임워크를 필요로 한다. 그런데 요즘엔 XP SP2이상이면 기본으로 깔려 있으니 상관 없을 듯.

SAX방식.
작고 가볍다.
MSXML에 비해 제공되는 기능은 적다. 파싱을 위한 코딩 량이 기존에 비해 커질 수 있다.
SAX방식.
SAX 방식.
utf-16지원.
Apache 프로젝트중 하나.
유니코드 지원 되는 듯.
파싱만 된다. 생성은 안됨.

  • ACEXML
SAX 방식.
utf-16지원.


검색해보니 17메가짜리 XML을 파싱하는데 SAX는 1초 DOM은 62초 넘게 걸렸다고 하네요. DOM은 XML 용량이 크지않고 데이터에 임의 접근이 자주 일어날 때, 내용을 XML 파일로 백업할 때 유용할 듯합니다. 그외 나머지는  SAX방식으로 접근하면 될 듯 하네요.

그나저나 구글 블로거에서 쓰니 영 글 모양새가 이쁘지가 않은...;; 


반응형
,